2010-12-01 22 views
0

Je voudrais reproduire l'effet spinner que Spinrite affiche dans le coin supérieur droit de l'écran pour indiquer qu'il fonctionne toujours et qu'il n'est pas gelé. Vous pouvez voir un exemple de ceci ici à 2:18 - http://youtu.be/XRmDwVj5CRMRéplication de l'effet d'animation Spinrite dans C

Nous pourrions débattre de l'efficacité de Spinrite jusqu'à ce que les vaches reviennent à la maison, mais on ne peut nier qu'il a une interface utilisateur décent vu son fonctionnement.

Je répliquerai l'effet en C sur une plate-forme ARM mais je recherche des conseils généraux plutôt que du code, comme par exemple comment incrémenter les étapes de l'animation.

Merci d'avance.

Répondre

1

C'est une vieille technologie là-bas, mais il semble que Gibson a mis à jour son interface utilisateur un peu . Je me souviens de son spinner étant les caractères/\ | - Mais je m'égare. :)

Ceci est en mode texte et très probablement fait en accrochant l'interruption de la minuterie dans DOS et en tirant chaque tick de la minuterie.

Une minuterie DOS standard cochée à peu près toutes les 55 millisecondes.

Vous pouvez dessiner directement à l'écran sous DOS sur un X86 en écrivant au pointeur 0xA0000 en utilisant le jeu de caractères DOS étendu goofy. (Notez que cela provient de la vieille mémoire, cela fait 15 ans et plus depuis que j'ai fait l'une de ces choses :) En d'autres termes, pour dessiner la lettre «A» à la première ligne/colonne de l'écran , vous feriez ce qui suit.Avec ce qui précède à l'esprit

 
    char *screen = 0xA0000; 
    *screen = 'A'; 

Pour obtenir un peu plus avancé, (pas d'erreur ou de vérification de limites.)

 
#define COLUMNS 80 
#define ROWS 25 
#define VIDMEM_BASE 0xA0000 

// Row and column are 1 based 
// Note that in a real implementation you would make sure row/column are within the screen bounds 
// and if you were on the last row, you might scroll the screen up etc. 
void writeScreen(char theChar, size_t row, size_t column) 
{ 
    char *screenBase = VIDMEM_BASE; 

    screenBase += ((row - 1) * COLUMNS) + column - 1; 
    *screenBase = theChar; 
} 

, vous devez comprendre comment ça fonctionne sur votre ARM système et le répliquer. En regardant un port de ncurses ou Borlands conio system pour l'ARM vous donnerait probablement une bonne longueur d'avance. Je sais qu'il y avait un portage de la bibliothèque Turbo Vision de Borland vers Linux, mais je ne suis pas sûr qu'il ait jamais été porté sur ARM. Voici un link à la page sourceforge si vous êtes intéressé. Turbo Vision était une interface graphique en mode texte en son temps, pour ce que ça vaut.

Espérons que cela aide.

0

Je n'ai pas travaillé sur une plateforme ARM depuis des lustres. Utilisé pour avoir un Archimède.

Je ne semble pas être en mesure de commenter la question, donc je vais demander des précisions ici:

Qu'est-ce que vous utilisez pour les graphiques pour l'animation? Je veux dire un GIF animé, un ensemble de fichiers bitmap, ou un dessin à partir de zéro à chaque fois, autre chose?

Je crois que sur ARM vous pouvez définir un rappel d'interruption d'horloge thingamajig. Cependant, cela serait probablement appelé même si l'application elle-même était gelée, conduisant incorrectement l'utilisateur à croire qu'il fonctionnait.

Je n'ai aucune idée de la bibliothèque de l'interface utilisateur ou de ce que vous utilisez, mais la plupart des travaux sur lesquels j'ai travaillé ont un moyen de poller() dans la file d'attente des événements. À chaque fois que poll() revient, calculez le temps écoulé depuis la dernière rediffusion de l'animation et si elle est suffisamment grande, passez à l'image suivante. Si ce n'est pas le cas, décrémentez le délai d'attente de poll() afin de ne pas bloquer trop longtemps dans poll(). Il est également possible que le système d'exploitation envoie parfois des événements temporisés dans la file d'attente des événements. Redessiner une image chaque fois que vous en lisez une dans la file d'attente des événements. Cela peut être particulièrement utile car si l'événement traite lentement les événements et commence à recevoir un backlog, l'animation ralentira. C'est à dire. le spinner tourne normalement à pleine vitesse, lentement lorsque l'application se débat et se débat, et s'arrête lorsque l'application se bloque.

Est-ce le genre d'information que vous cherchez?

Comme pour incrémenter les étapes de l'animation, je suis sûr que vous ne parle pas de quelque chose comme:

int step = 0; 

... 

step = (step + 1) % max_steps;