Image-stitching and virtual tour solutions My account Updates
It is currently Thu Oct 30, 2014 3:04 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 56 posts ]  Go to page Previous  1, 2, 3  Next
Author Message
 Post subject:
PostPosted: Sun Jan 02, 2011 6:45 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
martinlbb wrote:
Dans le fichier papywizard/driver/serialDriver.py, la méthode read (la dernière en bas du fichier).
Comme je dois lire tout ce qui est écrit sur la ligne série jusqu'au timout, cela me générait des erreurs.
La manière de penser n'est pas la même pour Clauss. Une réponse peut avoir de 1 à  3 CR. Je dois donc tout lire pour ne pas perdre d'arguments.

Mmmm, mieux vaut éviter de modifier le coeur, car il peut y avoir des effets de bord avec les autres plugins. Si tu as besoin de lire plus de choses, appelle la méthode read() plusieurs fois. Peux-tu poster ta modife, que je comprenne de quoi il retourne ?

Quote:
fma38 wrote:
L'offset est utilisé lorsque tu utilises le menu pour modifier la référence (la position où tu lis yaw=0, pitch=0). La Claus peut peut-être être mise à  zéro, mais pas la Merlin (ni d'autres têtes). Donc je gère ça au niveau au dessus du plugin.

OK, dois je le garder ?

Comme tu veux. Greg a aussi la possibilité de faire ça. Je lui ai conseillé de surcharger la méthode setReference() (définie dans la classe parent AbstractAxisPlugin). Là , tu peux appeler ton code bas niveau, et laisser _offset à  0. Mais tu vas perdre la fonctionnalité qui est de revenir à  la position initiale (menu hardware), qui est la position de la tête lors de l'allumage ; ça peut être intéressant (genre revenir à  cette position lors du shutdown)... à€ toir de voir.

Quote:
Ah sinon, ce serait bien d'implémenter un état de la batterie, avec affichage sur la barre d'état (batterie ou secteur). Mais est-ce que les autres têtes le gère ?

Non, pas vu. C'est pas évident de mettre des choses sépcifiques aux plugins dans la barre d'état... Il faudrait faire un autre truc, spécifique à  ce genre de chose. Mais cela veut dire modifier tous les plugins... Faudra y réfléchir plus à  fond.

Sinon, bravo !

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jan 02, 2011 6:55 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
fma38 wrote:
martinlbb wrote:
Dans le fichier papywizard/driver/serialDriver.py, la méthode read (la dernière en bas du fichier).
Comme je dois lire tout ce qui est écrit sur la ligne série jusqu'au timout, cela me générait des erreurs.
La manière de penser n'est pas la même pour Clauss. Une réponse peut avoir de 1 à  3 CR. Je dois donc tout lire pour ne pas perdre d'arguments.

Mmmm, mieux vaut éviter de modifier le coeur, car il peut y avoir des effets de bord avec les autres plugins. Si tu as besoin de lire plus de choses, appelle la méthode read() plusieurs fois. Peux-tu poster ta modife, que je comprenne de quoi il retourne ?

Pourquoi ne fais-tu pas comme dans le plugin de la Merlin (et des autres), en lisant 1 caractère à  la fois, et en bouclant jusqu'à  tout recevoir ? Et tu peux gérer le timeout toi-même à  l'appel du read, dans ta classe (avec un try/except)...

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jan 02, 2011 10:38 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Voila les deux fonctions (l'original en commenté et la modifiée dessous) :

#def read(self, size):
# data = self._serial.read(size)
# #Logger().debug("SerialDriver.read(): data=%s" % repr(data))
# if size and not data:
# raise IOError("Timeout while reading on serial bus (size=%d, data=%s)" % (size, repr(data)))
# else:
# return data

def read(self, size, retvalue = 0):
data = self._serial.read(size)
#Logger().debug("SerialDriver.read(): data=%s" % repr(data))
if retvalue == 0 and size and not data:
raise IOError("Timeout while reading on serial bus (size=%d, data=%s)" % (size, repr(data)))
elif size and not data:
return retvalue
else:
return data

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jan 02, 2011 10:40 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
Pourquoi ne fais-tu pas comme dans le plugin de la Merlin (et des autres), en lisant 1 caractère à  la fois, et en bouclant jusqu'à  tout recevoir ? Et tu peux gérer le timeout toi-même à  l'appel du read, dans ta classe (avec un try/except)...

C'est ce que je fais déjà , mais sans la modif, je me retrouve avec un IOError à  chaque fin de buffer. C'est que je veux éviter.

Pour le timeout, je le gère déjà  moi même

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 7:50 am 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Je ne comprend pas trop ; en principe, tu sais ce que tu attends comme réponse, non ? Je veux dire, tu dois pouvoir prédire, en fonction de la commande, combien de trames avec CR il y aura. Il te suffit donc de lire caractère par caractère, jusqu'à  recevoir le dernier (un petit compteur, et hop !).

Mieux, l'idéal serait de construire une expression régulière correspondant à  la réponse complète, et de faire la comparaison à  chaque caractère reçu (après l'avoir ajouté au buffer). à‡a, c'est même un truc que je pourrais, à  terme, ajouter au driver (dans la classe de base)...

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 10:48 am 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
Je ne comprend pas trop ; en principe, tu sais ce que tu attends comme réponse, non ? Je veux dire, tu dois pouvoir prédire, en fonction de la commande, combien de trames avec CR il y aura. Il te suffit donc de lire caractère par caractère, jusqu'à  recevoir le dernier (un petit compteur, et hop !).

Eh non, sur certaines commandes, j'ai une réponse qui peut être plus longue que prévue, sans que je m'y attende. Donc, ca peut varier de 2 à  3 CR par exemple sur la même commande :(


fma38 wrote:
Mieux, l'idéal serait de construire une expression régulière correspondant à  la réponse complète, et de faire la comparaison à  chaque caractère reçu (après l'avoir ajouté au buffer). à‡a, c'est même un truc que je pourrais, à  terme, ajouter au driver (dans la classe de base)...

Sauf que ca revient au même problème. Sur certaines réponses, j'ai deux regex différents à  appliquer, de longueurs différentes :(

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 11:00 am 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Ok, je vois (pas très sioux, leur protocole !!!)

Ceci-dit, tu n'as pas besoin de modifier la méthode read() du driver (il faudrait le faire pour tous les drivers, si tu veux pouvoir utiliser du bluetooth, par exemple). Capturer une exception n'est pas un problème du tout : c'est même beaucoup plus efficace, puisque ça n'apparaît qu'une seule fois, contrairement à  ton test¹.

De plus, j'ai constaté que suivant les plateformes, le timeout n'était pas toujours pris en compte. Tu cours le risque qu'il reste à  une valeur très élevée (genre plusieurs secondes !).

¹ et comme on dit : "Easier to Ask Forgiveness than Permission"

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 11:08 am 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
Ok, je vois (pas très sioux, leur protocole !!!)

Oui, le concepteur de la tête est certainement un bon ingé en elec, mais coté soft, j'ai pas l'impression que ce soit sa grand passion.

fma38 wrote:
Ceci-dit, tu n'as pas besoin de modifier la méthode read() du driver (il faudrait le faire pour tous les drivers, si tu veux pouvoir utiliser du bluetooth, par exemple). Capturer une exception n'est pas un problème du tout : c'est même beaucoup plus efficace, puisque ça n'apparaît qu'une seule fois, contrairement à  ton test¹.

Ohhh, je connaissais pas ! (je suis un fils du C Kernighan et Ritchie). C'est terriblement intéressant !
Et ce sera plus élégant que ma 'rustine'.

fma38 wrote:
De plus, j'ai constaté que suivant les plateformes, le timeout n'était pas toujours pris en compte. Tu cours le risque qu'il reste à  une valeur très élevée (genre plusieurs secondes !).

Exactement. C'est d'ailleurs ce que donne le premier copié collé sur ce post. Tu peux voir que la tête réponds chaque.... seconde !

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 12:31 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Bon, j'ai finalement décidé de conserver le modèle initial, basé sur la prédiction du nombre de CR (que je passe en arguments à  la méthode __sendCmd).
Sachant que je n'utilise pas les réponses supplémentaires (celles qui arrivent en plus de temps en temps), j'ai décidé de fixer un nombre de CR max par requête.

Ainsi, je boucle jusqu'au CR concerné, puis je vide la ligne série (driver.empty() ).
Et comme, ca je peux lire sans problème et sans timeout... :)

J'ai tout "recodé", ah marche nickel :)

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 12:44 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Il n'y a vraiment pas moyen de prédire le nombre de trames (terminée par CR) en fonction de la commande ?

Au fait, attention à  driver.empty() : cette méthode ne fonctionne que pour le driver série. Pour les drivers bluetooth et ethernet, elle est vide, car on ne peut pas savoir combien de caractères sont en attente dans le buffer. à€ la limite, je pourrais faire une boucle pour tout lire jusqu'au timeout... Sauf que dans el cas du bluetooth sous Windows, le timeout ne peut pas être changé, donc reste à  plusieurs secondes ! Tant pis, je vais quand même faire ça.

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 12:50 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
Il n'y a vraiment pas moyen de prédire le nombre de trames (terminée par CR) en fonction de la commande ?

Il y a 3 commandes qui retournent des valeurs non prédictives.

Deux dans la phase d'init :
La commande reset
Une commande inconnue en phase d'init.

Et la plus importante :
La commande de position (celle qui retourne la position physique de la tête) qui retourne de temps en temps un élément supplémentaire, quand la tête est proche de la position demandée.

fma38 wrote:
Au fait, attention à  driver.empty() : cette méthode ne fonctionne que pour le driver série. Pour les drivers bluetooth et ethernet, elle est vide, car on ne peut pas savoir combien de caractères sont en attente dans le buffer. à€ la limite, je pourrais faire une boucle pour tout lire jusqu'au timeout... Sauf que dans el cas du bluetooth sous Windows, le timeout ne peut pas être changé, donc reste à  plusieurs secondes ! Tant pis, je vais quand même faire ça.

Aïe :(

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 1:07 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Ouais, aïe, comme tu dis ! Le bluetooth, c'est de l'USB sans fil : une usine à  gaz tout aussi bordélique.

Plutôt que d'appeler empty() à  la fin de la réception de la réponse, tu ne peux pas le faire au début ? Puisque la réponse reprend toujours la commande, ça doit pas être difficile de filtrer ce qu'il y a éventuellement avant...

Note : dans la doc sur le wiki, tu devrais virer les codes hexa, et ne laisser que l'ASCII, ce serait plus lisible... Les codes hexas seraient utiles pour un protocole binaire ; l'ASCII est justement fait pour que ce soit lisible par nous autres, pov'z'umins.

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 2:06 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
Ouais, aïe, comme tu dis ! Le bluetooth, c'est de l'USB sans fil : une usine à  gaz tout aussi bordélique.

Autant j'aime beaucoup l'USB et la manière dont il a été pensé, autant je hais le bluetooth pour sa très mauvaise conception.

fma38 wrote:
Plutôt que d'appeler empty() à  la fin de la réception de la réponse, tu ne peux pas le faire au début ? Puisque la réponse reprend toujours la commande, ça doit pas être difficile de filtrer ce qu'il y a éventuellement avant...

Ca me va. Entre recoder la partie Bluetooth et modifier mon code, j'ai choisi !

fma38 wrote:
Note : dans la doc sur le wiki, tu devrais virer les codes hexa, et ne laisser que l'ASCII, ce serait plus lisible... Les codes hexas seraient utiles pour un protocole binaire ; l'ASCII est justement fait pour que ce soit lisible par nous autres, pov'z'umins.

Tu vas rire, mais j'ai mis l'Hexa car c'est plus lisible pour ce protocole à  cheval entre l'Ascii et l'hexa.
Autant sur d'autres protocole, je n'aurai mis que l'ASCII, autant celui est vraiment particulier.
C'est pour cela que c'est tout en double.

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 2:13 pm 
Offline
Administrator
User avatar

Joined: Mon Nov 14, 2005 4:56 pm
Posts: 5901
Location: Francin, France
C'est énorme le boulon fait ! Bravo les gars :)


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 2:22 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
AlexandreJ wrote:
C'est énorme le boulot fait ! Bravo les gars :)

Merci :)

Et bonne nouvelle, j'ai débridé la tête sur le mouvement vertical. Au lieu d'être limitée à  +90, -90°, elle peut se déplacer jusqu'à  +360, -360°.

Bien entendu, le driver s'adapte automatiquement en fonction des données du moteur : nombre de pas = résolution du moteur en ° et vitesse du moteur.

Virtuellement, le driver doit s'adapter à  toute type de tête Rodeon, quelque soit le type de moteur (plus ou moins précis, avec ou sans frein).

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 7:57 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Bon, j'ai tout qui marche !

Y'a plus qu'à  gérer les préférences de la tête Clauss (AF enclenché ou non, délais AF, double appareil ou non)
Ou puis-je l'intégrer ? Dans un onglet ? Dans un fichier de config ?

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 8:10 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Les plugins permettent de gérer leur config, via un GUI assez simple mais suffisant. Regarde dans la doc :

http://www.papywizard.org/wiki/DevelopGuide#Plugins

et dans les autres plugins... Tout se décrit via les méthodes _defineConfig() et _defineGui() des classes model et controller du plugin (attention à  bien utiliser les mêmes paramètres des 2 côtés).

Les valeurs entrées ici seront automatiquement sauvées dans le fichier de config général de Papywizard.

Met tes valeurs par défaut dans des constantes, en haut du fichier ; c'est plus pratique à  modifier par la suite.

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 8:19 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
OK :)

En attendant, une capture du log avec la connexion de la tête :


Quote:
2011-01-03 20:18:30,721::Main::INFO::Starting connection. Please wait...
2011-01-03 20:18:30,771::Main::INFO::ClaussHardware.init(): Transceiver brand=CLAUSS
2011-01-03 20:18:30,798::Main::INFO::ClaussHardware.init(): Transceiver firmware version=02.00
2011-01-03 20:18:30,871::Main::INFO::ClaussHardware.init(): axis=1, motor firmware version=01.05
2011-01-03 20:18:30,891::Main::INFO::ClaussHardware.init(): axis=1, motor numbers of steps=24000, axis accuracy=0.015°
2011-01-03 20:18:31,059::Main::INFO::ClaussHardware.init(): axis=2, motor firmware version=01.05
2011-01-03 20:18:31,078::Main::INFO::ClaussHardware.init(): axis=2, motor numbers of steps=60000, axis accuracy=0.006°
2011-01-03 20:18:31,263::Main::INFO::ClaussHardware.init(): Clauss head is on AC power
2011-01-03 20:18:31,267::Main::INFO::Connection started

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jan 03, 2011 8:51 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
Joli :)

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 04, 2011 11:57 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Bon, bah y'a tout qui marche :)

Les options sont codées, y compris le dual camera (que je dois tester en import avec APG).

Pour le single camera, ca import nickel (bracketing) dans APG.

Parfait :)

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 05, 2011 1:47 pm 
Offline
Administrator
User avatar

Joined: Mon Nov 14, 2005 4:56 pm
Posts: 5901
Location: Francin, France
Perfect :)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 05, 2011 1:59 pm 
Offline
Member
User avatar

Joined: Wed Dec 07, 2005 6:21 pm
Posts: 5826
Location: Grenoble, France
J'ai quand même peur que le mode 'dual camera' ne puisse pas fonctionner avec le filtre d'import Papywizard. En effet, tu vas générer 2 photos à  chaque fois, mais il n'y en aura qu'une seule inscrite dans le fichier xml... Pour que ça marche, il faut modifier des choses dans le coeur de Papywizard.

_________________
Frédéric

Canon 20D + 17-40/f4 L USM + 70-200/f4 L USM + 50/f1.4 USM
Merlin/Orion panohead + Papywizard on Nokia N800 and HP TC-1100


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 05, 2011 2:54 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
fma38 wrote:
J'ai quand même peur que le mode 'dual camera' ne puisse pas fonctionner avec le filtre d'import Papywizard. En effet, tu vas générer 2 photos à  chaque fois, mais il n'y en aura qu'une seule inscrite dans le fichier xml... Pour que ça marche, il faut modifier des choses dans le coeur de Papywizard.

C'est marrant, je me faisais la même réflexion tout à  l'heure en me promenant.

Je laisse pour le moment l'option en attendant de toucher (ou non ?) au coeur de Papywizard.

Dans le même ordre d'idée, je reviens sur l'état de la batterie. Sachant que la plupart des têtes motorisées sont sur batterie (et si elle disposent d'une commande d'état de la batterie), cela serait utile d'ajouter cette fonctionnalité dans une nouvelle release.
Ce que je ne sais pas, c'est si les différentes têtes supportées sont capables de donner l'état de leur batterie ?
Clauss : Oui
Merlin/Orion ?

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
 Post subject:
PostPosted: Tue Mar 15, 2011 11:14 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Le code est dispo sur le SVN de Papywizard.

S'il y a des volontaires pour tester ?

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Last edited by martinlbb on Wed Mar 16, 2011 8:23 am, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 14, 2011 4:21 pm 
Offline
Member
User avatar

Joined: Thu Apr 15, 2010 12:41 pm
Posts: 57
Location: Lyon
Le modèle VR Head a été testé avec succès sous PapyWizard.

Bonne nouvelle :)

_________________
Révéler les beautés cachées ou hors de portée : http://www.martinloyer.fr


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 56 posts ]  Go to page Previous  1, 2, 3  Next

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group