|
|
// ***********************************************************
// Project: Intervallometre pour EOS 350D
// Author: Pierre NERZIC, 16 avril 2007
// Site: http://pierre.nerzic.free.fr/
// Module description: firmware de TimEOS,
// permet d´effectuer N poses de T secondes
//
// Licence: proposé pour information sous licence GPL
// Vous avez le droit de vous en servir à condition de toujours
// laisser mon nom et la référence à mon site internet.
// ***********************************************************
// fichier de compatibilité IAR - GCC, il inclut les defs du contrôleur
#include "compat.h"
// prototypes des fonctions
void LCDcommand(unsigned char code);
void ClearLCD(void);
//void GotoLC(unsigned char l, unsigned char c);
void Write(const unsigned char *s);
//void Write4C(unsigned long abcd);
void WriteShort(unsigned short nb);
void WriteTextAdr4(unsigned char adr);
void WriteTextAdr8(unsigned char adr1, unsigned char adr2);
#define GotoL0C0 LCDcommand(0x80);
#define GotoL1C0 LCDcommand(0xC0);
//#define Mk4C(a,b,c,d) ((((unsigned long)a)<<24)|(((unsigned long)b)<<16)|(((unsigned long)c)<<8)|((unsigned long)d))
/************ Affectation des ports d´entrées-sorties du ATtiny2313 :
AFFICHEUR :
S PD5 rétroéclairage (PWM)
S PB6 E
S PB5 Rs
S PB4 R/W
S PB3 DB7
S PB2 DB6
S PB1 DB5
S PB0 DB4
CLAVIER :
E PD6 menu bas
E PD4 menu haut
E PD3 plus
E PD2 moins
EOS :
S PD1 prise de vue
S PD0 mise au point
*/
/************************************/
/******** GESTION DE L´EEPROM *******/
/************************************/
/************ Utilisation de l´EEPROM :
les 16 premiers octets = valeurs numériques de config
ensuite : les textes affichés sur le LCD, voir WriteTextAdr4
0F 03 0F 00 00 02 00 01 00 A7 61 FF FF FF FF FF
FF FF FF FF FF FF FF FF 4E 62 20 50 6F 73 65 73
54 70 73 20 4D 61 50 20 4D 69 72 20 50 73 65 20
46 69 6E 20 52 65 74 72 6F 45 63 6C 45 6E 72 20
43 6F 6E 66 50 72 65 74 41 6E 6E 75 6C 65 65 20
2D 53 61 75 76 65 65 2D 4E 75 6D 20 43 61 6C 69
62 43 6C 6B 25 49 6E 63 FF FF FF FF FF FF FF FF
20 54 69 6D 45 4F 53 20 50 2E 4E 65 72 7A 69 63
*/
void EEPROM_write(unsigned char adr, unsigned char *data, unsigned char size)
{
while (size-- > 0) {
while (EECR & (1<<EEPE));
EEAR = adr++;
EEDR = *data++;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}
}
void EEPROM_read(unsigned char adr, unsigned char *data, unsigned char size)
{
while (size-- > 0) {
while (EECR & (1<<EEPE));
EEAR = adr++;
EECR |= (1<<EERE);
*data++ = EEDR;
}
}
/************************************/
/******* VARIABLES DE CONTRÔLE ******/
/************************************/
//// valeurs de configuration du logiciel, stockées en eeprom
struct configuration {
unsigned char RetroEclRatio; // ratio d´éclairage de l´écran 0..255
unsigned char NbrePoses; // nombre de poses 1..255
unsigned short DureePoses; // durée de chaque pose 1..9999s
unsigned char AllongementPoses; // allongement des poses 0..500%
unsigned char DureeMiseAuPoint; // durée de gestion de la mise au point 0..9s
unsigned char DureeMiroir; // durée de relevage du miroir 0..9s
unsigned short DureeFinPose; // durée de fin de pose 1..9999s
unsigned short CalibrationTicks; // ajustement de l´horloge CTC (timer1)
};
// valeurs des variables, copie de l´eeprom
struct configuration Configuration; // = { 15, 3, 15, 0, 2, 2, 0, 24999 };
//// lecture et enregistrement des valeurs de configuration dand l´eeprom
// nb: la directive inline ne semble pas marcher sur le compilo utilisé ici
#define InitConfig() { EEPROM_read(0, (unsigned char *)&Configuration, sizeof(Configuration)); }
#define SaveConfig() { EEPROM_write(0, (unsigned char *)&Configuration, sizeof(Configuration)); }
/************************************/
/******** GESTION DU CLAVIER ********/
/************************************/
//// Le clavier est connecté au PortD bits 2,3,4 et 6
//// On examine l´état des touches pour affecter la variable globale Touche
//// On évite les problèmes de rebond en comptant le nombre de Ticks pendant
//// laquelle la touche est restée enfoncée. On produit aussi les répétitions
//// au bout d´un certain nombre de ticks, et ça gère aussi la vitesse de répétition.
enum ToucheCode {
NONE=0,
MOINS=1, // bleu
PLUS=2, // rouge
UP=3, // noir
DOWN=4 // jaune
};
// variable globale à utiliser dans main()
Register(r2, unsigned char Touche); // = NONE; // contient le code de la touche enfoncée ou NONE
// variables de gestion : touche précédemment enfoncée et durée d´enfoncement
Register(r3, unsigned char ToucheEnfoncee); // = NONE;
Register(r4, unsigned char ToucheEnfonceeDepuis); // = 0;
#define Limite1 2 // nombre de ticks avant prise en compte (2/10s)
#define Limite2 9 // nombre de ticks avant début de répétition (9/10s)
#define Limite3 11 // (Limite3-Limite2) = vitesse de répétition (en nbre de ticks)
unsigned char TestTouche(unsigned char bit, enum ToucheCode code)
{
// la touche est-elle enfoncée ?
if (bit == 0) {
// était-elle déjà enfoncée ?
Touche = 0; //NONE;
if (ToucheEnfoncee == code) {
// oui, elle était déjà enfoncée précédemment
if (ToucheEnfonceeDepuis == Limite1 || ToucheEnfonceeDepuis == Limite2) {
Touche = code;
}
if (ToucheEnfonceeDepuis >= Limite3) ToucheEnfonceeDepuis = Limite2;
else ToucheEnfonceeDepuis++;
} else {
// c´est une nouvelle touche enfoncée
ToucheEnfoncee = code;
ToucheEnfonceeDepuis = 1;
}
}
return !bit;
}
void MajToucheEnfoncee(void)
// fonction appelée par l´IT Tick, pour mettre à jour la variable globale Touche
{
// l´une des touches est-elle enfoncée ?
if (TestTouche(BIT2(PIND), MOINS) ||
TestTouche(BIT3(PIND), PLUS) ||
TestTouche(BIT4(PIND), UP) ||
TestTouche(BIT5(PIND), DOWN))
return;
// aucune touche n´est enfoncée
Touche = ToucheEnfoncee = 0; //NONE;
ToucheEnfonceeDepuis = 0;
}
/************************************/
/********* GESTION DE l´EOS *********/
/************************************/
//// le déroulement des opérations avec l´appareil photo est géré par un
//// automate à états. Selon son état, on commute de telle ou telle manière
//// les signaux sur la prise jack. Des compteurs sont utilisés pour changer
//// l´état courant quand ils arrivent à zéro.
// état de l´automate d´état : où en est-il ?
enum EtatAutomate {
STOP=0, // aucune série en cours
DEBUT, // début d´une série de poses
MISEAUPOINT, // la mise au point est en cours
MIROIR, // le relevage du miroir est en cours
POSE, // une pose est en cours
FINPOSE // une pose se finit, on attend avant la suivante
};
Register(r5, unsigned char EtatAutomate);
// compteurs de cycles (= 1 seconde sur telle ou telle chose) restant à faire
Register(r6, unsigned char RestantNbrePoses); // nombre de poses restant à faire
unsigned short RestantCpt; // temps restant dans l´état courant
unsigned short DureePose; // durée de la pose courante = Configuration.DureePose
// cette routine gère l´avancement des poses, elle est appelée par l´IT Tick
// à chaque fois qu´elle fait return, 1 seconde s´écoule avant l´appel suivant
void EvolutionAutomate(void)
{
switch (EtatAutomate) {
case STOP:
// rien n´est en cours, on RAZ toutes les variables
BIT0(PORTD) = 0; // mise au point = off
BIT1(PORTD) = 0; // prise de vue = off
RestantNbrePoses = 0;
RestantCpt = 0;
return;
case DEBUT:
// initialisation d´une série
RestantNbrePoses = Configuration.NbrePoses;
DureePose = Configuration.DureePoses;
EtatAutomate = MISEAUPOINT;
RestantCpt = Configuration.DureeMiseAuPoint;
case MISEAUPOINT:
// phase de mise au point
if (RestantCpt > 0) {
RestantCpt--;
BIT0(PORTD) = 1; // début de la mise au point
return;
}
BIT0(PORTD) = 0; // fin de la mise au point
// fin de la mise au point, on commence les poses
loop:
EtatAutomate = MIROIR;
RestantCpt = Configuration.DureeMiroir;
BIT1(PORTD) = 1; // relever le miroir ou démarrer la pose
if (RestantCpt > 0) return;
case MIROIR:
// phase de relevage du miroir
if (RestantCpt > 0) {
RestantCpt--;
BIT1(PORTD) = 0; // fin de relever le miroir
return;
}
EtatAutomate = POSE;
RestantCpt = DureePose;
BIT1(PORTD) = 1; // début de la pose
case POSE:
// une pose est en cours
if (RestantCpt > 0) {
RestantCpt--;
return;
}
// fin de la pose
EtatAutomate = FINPOSE;
BIT1(PORTD) = 0; // fin de la pose
RestantCpt = Configuration.DureeFinPose;
case FINPOSE:
// on attend avant la pose suivante
if (RestantCpt > 0) {
RestantCpt--;
} else {
// fin de la pose : autres poses ou fin totale ?
RestantNbrePoses--;
if (RestantNbrePoses == 0) {
// il ne reste plus aucune pose à faire, on arrête
EtatAutomate = STOP;
Touche = MOINS; // débloque la boucle princ, fait afficher "Pret..."
return;
}
DureePose = (DureePose * (100+Configuration.AllongementPoses)) / 100;
goto loop; // retourne au niveau du verrouillage miroir
}
return;
}
}
void WriteEtatAutomate(void)
// affiche l´état d´avancement de la série, appelé par l´IT Tick
{
if (EtatAutomate == STOP) return;
ClearLCD();
WriteTextAdr4(0x58); // "Num "
WriteShort(RestantNbrePoses);
GotoL1C0;
WriteTextAdr4(0x1C + (EtatAutomate<<2)); // Mir ou Map ou Pse ou Fin
WriteShort(RestantCpt+1); // nombre+1 (10..1 p. ex.)
}
/************************************/
/********* GESTION DU TEMPS *********/
/************************************/
//// Le temps est géré par interruption. Le Timer1 (16 bits) est configuré en
//// mode CTC : retour à zéro quand le compteur égale OCR1A. Ca permet d´ajuster
//// exactement la fréquence des interruptions.
//// Sa routine d´interruption est donc appelée TICKS=10 fois par seconde
//// Elle met à jour l´état du clavier et gère l´avancement des poses.
//// Le timer0 (8 bits) sert à gérer l´intensité du rétroéclairage à l´aide
//// de sa 2e sortie PWM (OC0B).
#define TICKS 10 // nombre d´IT par seconde
// ce nombre est ajusté à l´aide de Configuration.CalibrationTicks
// le but est d´obtenir !exactement! TICKS interruptions par seconde
//// NB : version béta : les horloges et calculs n´ont pas été vérifiés !
void InitTimers(void)
// configuration des timers : timer0 = PWM, timer1 = CTC
{
// modif du prescaler, voir page 30 du datasheet complet
// prescaler/4 = fIO = finterne/4 = 250 kHz
CLKPR = 0x80; // armer l´écriture de CLKPR
CLKPR = 0x02; // => prescaler = 4,horloge = 250000 Hz
//// NB: A VERIFIER EXACTEMENT !!
/*** configurer le timer0 et sa sortie PWM OC0B ***/
//// config timer0 en mode "phase correct PWM" avec sortie du signal sur OC0B
// WGM0 = 001 phase correct PWM
// COM0A = 00 pas de sortie sur OC0A
// COM0B = 11 sortie OC0B : set on match when upcounting, clear on downcounting
// CS0 = 001 pas de prescaling => freq PWM = 510 Hz (fIO/510)
/* TCCR0B : Timer/Counter 0 Control Register B */
// #define FOC0A 7 0
// #define FOC0B 6 0
// #define - 5 0
// #define - 4 0
// #define WGM02 3 0
// #define CS02 2 0
// #define CS01 1 0
// #define CS00 0 1
TCCR0B = 0x01;
/* TCCR0A : Timer/Counter 0 Control Register A */
// #define COM0A1 7 0 // COMA = 00 => pas de sortie
// #define COM0A0 6 0
// #define COM0B1 5 1 // COMB = 11 => sortie inversée
// #define COM0B0 4 1
// #define - 3 0
// #define - 2 0
// #define WGM01 1 0
// #define WGM00 0 1
TCCR0A = 0x31;
/*** configurer le timer1 = ticks = IT régulière ***/
//// config timer1 en mode "CTC" sans sorties
// WGM1 = 0100 CTC = clear timer on compare match
// COM1A = 00 pas de sortie
// COM1B = 00 pas de sortie
// CS1 = 001 division par N=1 =>
/* TCCR1A : Timer/Counter 1 Control Register */
// #define COM1A1 7 0 // COM* = 00 => pas de sortie
// #define COM1A0 6 0
// #define COM1B1 5 0
// #define COM1B0 4 0
// #define WGM11 1 0 // WGM1 = 0100 => CTC
// #define WGM10 0 0
// TCCR1A = 0x00;
/* TCCR1B : Timer/Counter 1 Control and Status Register */
// #define ICNC1 7 0
// #define ICES1 6 0
// 5 0
// #define WGM13 4 0
// #define WGM12 3 1
// #define CS12 2 0 // CS1 = 000 => clk/2 (N=2)
// #define CS11 1 1
// #define CS10 0 0
TCCR1B = 0x0A;
// limite haute du compteur CTC : p99 du datasheet
// on veut freq = horloge / (N*(1+OCR1A)) =exactement TICKS hertz
// avec horloge = 1250000 et N=1
// OCR1A = Configuration.CalibrationTicks; // exactement TICKS interruptions par seconde à 1MHz
// NB: OCR1A est positionnée dans la routine d´interruption, donc inutile de le faire ici
// autoriser l´interruption TIMER1_COMPA (IT quand égalité entre OCR1A et le compteur)
BIT6(TIMSK) = 1;
// on lance la mécanique des interruptions
__enable_interrupt();
}
//// routine d´interruption du timer 1 : appelée pour TCNT1 == OCR1A
// elle est appelée exactement TICKS fois par seconde
Register(r7, unsigned char NbTicksIgnores); // pour ignorer TICKS-1/TICKS appels
#ifdef __ICCAVR__
#pragma vector=TIMER1_COMPA_vect
#endif
ISR(TIMER1_COMPA_vect)
{
//// deux parties : 1) gérer le clavier TICKS fois par seconde,
//// 2) gérer l´EOS une seule fois par seconde
// consulter l´état des touches du clavier
MajToucheEnfoncee();
// mettre à jour les limites de comptage des timers
OCR0B = Configuration.RetroEclRatio;
OCR1A = Configuration.CalibrationTicks;
//// ignorer TICKS-1 appels, pour ne continuer qu´1 seule fois par seconde
NbTicksIgnores++;
if (NbTicksIgnores < TICKS) return;
NbTicksIgnores = 0;
// évolution de la pose en cours
EvolutionAutomate();
WriteEtatAutomate();
}
/************************************/
/**** GESTION DE L´AFFICHEUR LCD ****/
/************************************/
inline void InitPorts(void)
{
/*** configurer les ports et les valeurs par défaut ***/
// le port D = 0, 1 et 5 sorties, le reste = entrées avec pull-up
DDRD = 0x23;
PORTD = 0x5C;
// PortB0-6 sont tous des sorties
DDRB = 0x7F;
// PORTB = 0x00;
}
/** Partie bas-niveau : bit banging sur le port B **/
void shortpause(unsigned short nb)
// il faudrait la calibrer... pour supprimer tous les délais inutiles
{
while (nb > 0) nb--;
}
void LCDset(unsigned char RS, unsigned char RW, unsigned char DB)
{
// positionner RS, RW et DB, mettre E à 0
unsigned char bits = (DB & 0x0F); // ne garder que le poids faible de DB
if (RS) bits |= 0x20; // bit5 = Rs
if (RW) bits |= 0x10; // bit4 = R/W
PORTB = bits; // mettre ce nombre en sortie
// mettre E à 1 pendant 250ns au moins
BIT6(PORTB) = 1;
// attendre quelques cycles d´horloge à 8MHz >= 250nS
shortpause(10);
// mettre E à 0
BIT6(PORTB) = 0;
}
void LCDcommand(unsigned char code)
{
LCDset(0, 0, code>>4);
LCDset(0, 0, code); // rq: le masquage est fait dans LCDset
}
void LCDdata(unsigned char code)
{
LCDset(1, 0, code>>4);
LCDset(1, 0, code);
}
void InitLCD(void)
{
//// séquence d´initialisation
// attendre plus de 30 ms
// __sleep(); // marche bien sans ça
LCDset(0,0,0x2);
LCDcommand(0x2C);
// attendre 39us
shortpause(200);
LCDcommand(0x0C);
// attendre 39us
shortpause(200);
LCDcommand(0x01);
// attendre 1.53ms
shortpause(8000);
LCDcommand(0x06);
}
/** Partie haut-niveau : fonctions d´affichage **/
void ClearLCD(void)
{
LCDcommand(0x01);
shortpause(1000);
}
//void GotoLC(unsigned char l, unsigned char c)
//{
// // positionner le curseur en l,c
// LCDcommand((c&0x7)|(l?0xC0:0x80));
//}
//void Write4C(unsigned long abcd)
//{
// LCDdata(abcd>>24);
// LCDdata((abcd>>16)&0xFF);
// LCDdata((abcd>>8)&0xFF);
// LCDdata(abcd&0xFF);
//}
void Write(const unsigned char *s)
{
while (*s) {
LCDdata(*s);
s++;
}
}
// buffer pour contenir des textes temporaires
unsigned char tmp[9];
void WriteShort(unsigned short nb)
// écrit le nombre nb avec ch chiffres, ex : ch=4 pour 0..9999
{
// convertir le nombre en chaine
signed char i;
for (i=4; i>=0; i--) {
tmp[i] = (nb % 10) + ´0´;
nb = nb / 10;
if (nb == 0) break;
}
tmp[5] = 0;
// afficher la chaine (infini + premiers chiffres si > ch)
if (nb != 0) tmp[i] = 0xF3;
Write(&tmp[i]);
}
void WriteTextAdr4(unsigned char adr)
{
EEPROM_read(adr, tmp, 4);
tmp[4] = 0;
Write(tmp);
}
void WriteTextAdr8(unsigned char adr1, unsigned char adr2)
{
EEPROM_read(adr1, tmp, 4);
EEPROM_read(adr2, tmp+4, 4);
tmp[8] = 0;
Write(tmp);
}
/************************************/
/******* PROGRAMME PRINCIPAL ********/
/************************************/
//// Gestion des menus cycliques pour configurer chaque valeur
enum Menu {
TITRE=0,
CONFIGNBREPOSE,
CONFIGDUREEPOSE,
CONFIGINCPOSE,
CONFIGDUREEMAP,
CONFIGDUREEMIR,
CONFIGDUREEFIN,
CONFIGRETRO,
CONFIGCLOCK,
CONFIGRECORD,
POSES,
MENUDERNIER
};
Register(r8, unsigned char Menu);
// état de la configuration : changée par rapport à l´EEprom ?
Register(r9, signed char ConfigSauvee); // pour afficher le message sauvee (+1) ou remise (-1)
// permet d´accelérer dans la sélection de la durée des poses
#define ACCELERATIONPOSE 24
__C_task void main(void)
{
// initialisation des sous-systèmes
InitPorts();
InitConfig();
InitTimers();
InitLCD();
ConfigSauvee = 1;
// boucle infinie de gestion du clavier
for (;;) {
// afficher le titre du menu et récupérer la valeur à configurer
ClearLCD();
unsigned short valeur=0,min=0,max=9,pas=1;
switch (Menu) {
case TITRE:
WriteTextAdr8(0x70,0x74);
break;
case CONFIGNBREPOSE:
WriteTextAdr8(0x18,0x1C);
valeur = Configuration.NbrePoses;
min = 1; max = 255;
break;
case CONFIGDUREEPOSE:
WriteTextAdr8(0x20,0x2C);
valeur = Configuration.DureePoses;
pas = 1 + (valeur/ACCELERATIONPOSE);
min = 1; max = 9999;
break;
case CONFIGINCPOSE:
WriteTextAdr8(0x64,0x2B);
valeur = Configuration.AllongementPoses;
max = 250; pas=25;
break;
case CONFIGDUREEMAP:
WriteTextAdr8(0x20,0x24);
valeur = Configuration.DureeMiseAuPoint;
break;
case CONFIGDUREEMIR:
WriteTextAdr8(0x20,0x28);
valeur = Configuration.DureeMiroir;
break;
case CONFIGDUREEFIN:
WriteTextAdr8(0x20,0x30);
valeur = Configuration.DureeFinPose;
pas = 1 + (valeur/ACCELERATIONPOSE);
min=1; max = 9999;
break;
case CONFIGRETRO:
WriteTextAdr8(0x34,0x38);
valeur = Configuration.RetroEclRatio;
max = 255; pas = 3;
break;
case CONFIGCLOCK:
WriteTextAdr8(0x5C,0x60);
valeur = Configuration.CalibrationTicks;
min = 22000; max = 27000;
break;
case CONFIGRECORD:
WriteTextAdr8(0x3C,0x40);
break;
case POSES:
WriteTextAdr4(0x44);
break;
}
// afficher la valeur numérique à configurer
GotoL1C0;
switch (Menu) {
case TITRE:
WriteTextAdr8(0x78,0x7C);
break;
case CONFIGNBREPOSE:
case CONFIGDUREEPOSE:
case CONFIGINCPOSE:
case CONFIGDUREEMAP:
case CONFIGDUREEMIR:
case CONFIGDUREEFIN:
case CONFIGRETRO:
case CONFIGCLOCK:
WriteShort(valeur);
break;
case CONFIGRECORD:
switch (ConfigSauvee) {
case -1:
WriteTextAdr8(0x48,0x4C);
break;
case 1:
WriteTextAdr8(0x50,0x54);
break;
}
break;
case POSES:
WriteShort(Configuration.NbrePoses);
LCDdata(´x´);
WriteShort(Configuration.DureePoses);
break;
}
// attendre qu´on enfonce une touche (ou que la pose soit finie)
Touche = NONE;
while (Touche == NONE) __sleep();
// selon la touche
unsigned char menuprec = Menu;
GotoL1C0;
switch (Touche) {
case MOINS:
switch (Menu) {
case CONFIGNBREPOSE:
case CONFIGDUREEPOSE:
case CONFIGINCPOSE:
case CONFIGDUREEMAP:
case CONFIGDUREEMIR:
case CONFIGDUREEFIN:
case CONFIGRETRO:
case CONFIGCLOCK:
if (valeur >= min+pas) valeur-=pas;
else valeur = min;
break;
case CONFIGRECORD:
InitConfig();
ConfigSauvee = -1;
break;
case POSES:
EtatAutomate = STOP;
break;
}
ConfigSauvee = 0;
break;
case PLUS:
switch (Menu) {
case CONFIGNBREPOSE:
case CONFIGDUREEPOSE:
case CONFIGINCPOSE:
case CONFIGDUREEMAP:
case CONFIGDUREEMIR:
case CONFIGDUREEFIN:
case CONFIGRETRO:
case CONFIGCLOCK:
if (valeur <= max-pas) valeur+=pas;
else valeur = max;
break;
case CONFIGRECORD:
SaveConfig();
ConfigSauvee = 1;
break;
case POSES:
EtatAutomate = DEBUT;
break;
}
ConfigSauvee = 0;
break;
case UP:
if (EtatAutomate != STOP) break;
if (ConfigSauvee < 0) ConfigSauvee = 1;
if (Menu > 1) Menu--;
else Menu = MENUDERNIER-1;
break;
case DOWN:
if (EtatAutomate != STOP) break;
if (ConfigSauvee < 0) ConfigSauvee = 1;
if (Menu < MENUDERNIER-1) Menu++;
else Menu = 1;
break;
}
// réaffecter la valeur configurée
switch (menuprec) {
case CONFIGNBREPOSE:
Configuration.NbrePoses = valeur;
break;
case CONFIGDUREEPOSE:
Configuration.DureePoses = valeur;
break;
case CONFIGINCPOSE:
Configuration.AllongementPoses = valeur;
break;
case CONFIGDUREEMAP:
Configuration.DureeMiseAuPoint = valeur;
break;
case CONFIGDUREEMIR:
Configuration.DureeMiroir = valeur;
break;
case CONFIGDUREEFIN:
Configuration.DureeFinPose = valeur;
break;
case CONFIGRETRO:
Configuration.RetroEclRatio = valeur;
break;
case CONFIGCLOCK:
Configuration.CalibrationTicks = valeur;
break;
}
}
}
|