summaryrefslogtreecommitdiff
path: root/n/es/src/ascenseur.c
diff options
context:
space:
mode:
Diffstat (limited to 'n/es/src/ascenseur.c')
-rw-r--r--n/es/src/ascenseur.c133
1 files changed, 73 insertions, 60 deletions
diff --git a/n/es/src/ascenseur.c b/n/es/src/ascenseur.c
index 0cbe866..964ca41 100644
--- a/n/es/src/ascenseur.c
+++ b/n/es/src/ascenseur.c
@@ -32,7 +32,7 @@
uint8_t ascenseur_vitesse_voulue;
uint8_t ascenseur_vitesse;
uint8_t ascenseur_min_monte = 0x20;
-uint8_t ascenseur_max_monte = 0x03;
+uint8_t ascenseur_max_monte = 0x05;
uint8_t ascenseur_accel_monte = 1;
uint8_t ascenseur_min_descend = 0x10;
uint8_t ascenseur_max_descend = 0x01;
@@ -40,7 +40,10 @@ uint8_t ascenseur_accel_descend = 1;
uint8_t ascenseur_max;
uint8_t ascenseur_min;
uint8_t ascenseur_accel;
-uint8_t ascenseur_state = ASCENSEUR_LIBRE;
+uint8_t ascenseur_state = WAIT;
+uint8_t asc_ordre;
+uint8_t asc_message;
+
#define TC_STOP 0x00
#define TC_GO 0x1f /* mode CTC | OC2 | prescaler = 128. */
@@ -58,76 +61,86 @@ static uint8_t capteur_milieu();
static void asc_libre(void);
static void ascenseur_update_vitesse (void);
-
void ascenseur_init ()
{
TCCR2 = TC_STOP;
+ ascenseur_state = WAIT;
+ asc_libre();
}
void ascenseur_update ()
{
switch (ascenseur_state)
{
- case ASCENSEUR_LIBRE:
- asc_libre ();
- break;
- case ASCENSEUR_STOP:
- asc_stable ();
- break;
- case ASCENSEUR_MONTE:
- if (capteur_haut ())
- {
- ascenseur_state = ASCENSEUR_MONTE_STOP;
- ascenseur_vitesse_voulue = ascenseur_min;
- }
- ascenseur_update_vitesse ();
- asc_haut (ascenseur_vitesse);
- break;
- case ASCENSEUR_MONTE_STOP:
- if (!capteur_haut ())
- {
- ascenseur_state = ASCENSEUR_STOP;
- }
- ascenseur_update_vitesse ();
- asc_haut (ascenseur_vitesse);
- break;
- case ASCENSEUR_DESCEND:
- if (capteur_bas ())
- {
- ascenseur_state = ASCENSEUR_DESCEND_STOP;
- ascenseur_vitesse_voulue = ascenseur_min;
- }
- ascenseur_update_vitesse ();
- asc_bas (ascenseur_vitesse);
- break;
- case ASCENSEUR_DESCEND_STOP:
- if (!capteur_bas ())
- {
- ascenseur_state = ASCENSEUR_STOP;
- }
- ascenseur_update_vitesse ();
- asc_bas (ascenseur_vitesse);
- break;
- case ASCENSEUR_MILIEU:
- if (capteur_milieu ())
- {
- ascenseur_state = ASCENSEUR_MILIEU_STOP;
- ascenseur_vitesse_voulue = ascenseur_min;
- }
- ascenseur_update_vitesse ();
- asc_bas (ascenseur_vitesse);
- break;
- case ASCENSEUR_MILIEU_STOP:
- if (!capteur_milieu ())
- {
- ascenseur_state = ASCENSEUR_STOP;
- }
- ascenseur_update_vitesse ();
- asc_bas (ascenseur_vitesse);
- break;
+ case CMD_Mgrande: // monter à vive allure
+ ascenseur_update_vitesse ();
+ asc_haut (ascenseur_vitesse);
+ asc_message = 255;
+ if (capteur_haut())
+ ascenseur_state = CMD_Mpetite;
+ else
+ ascenseur_state = CMD_Mgrande;
+ break;
+ case CMD_Mpetite: // monter en réduisant la vitesse
+ ascenseur_vitesse_voulue = ascenseur_min;
+ ascenseur_update_vitesse ();
+ asc_haut (ascenseur_vitesse);
+ asc_message = 255;
+ if (capteur_bas())
+ ascenseur_state = ERR;
+ else if (capteur_haut())
+ ascenseur_state = CMD_Mpetite;
+ else
+ ascenseur_state = TENIR;
+ break;
+ case TENIR: // maintenir le mobile en haut
+ asc_stable();
+ if (asc_message != 0) asc_message = 1;
+ if (capteur_bas())
+ ascenseur_state = ERR;
+ else if (asc_ordre == 0x02)
+ {
+ ascenseur_state = CMD_D;
+ asc_ordre = 0;
+ }
+ else
+ ascenseur_state = TENIR;
+ break;
+ case CMD_D: // descente du mobile
+ ascenseur_vitesse_voulue = ascenseur_max;
+ ascenseur_update_vitesse ();
+ asc_bas (ascenseur_vitesse);
+ asc_message = 255;
+ if (!capteur_bas())
+ ascenseur_state = CMD_D;
+ else
+ ascenseur_state = WAIT;
+ break;
+ case WAIT: // attente mobile normalement en bas
+ asc_libre();
+ asc_message = 255;
+ if (capteur_bas() && (asc_ordre ==0x01 ))
+ {
+ ascenseur_state = CMD_Mgrande;
+ asc_ordre = 0;
+ }
+ else
+ ascenseur_state = WAIT;
+ break;
+ case ERR: // etat d'erreur
+ if (asc_message != 0) asc_message = 2;
+ asc_libre();
+ if (capteur_bas() && (asc_ordre == 0x01))
+ {
+ ascenseur_state = CMD_Mgrande;
+ asc_ordre = 0;
+ }
+ else
+ ascenseur_state = ERR;
}
}
+
static void
ascenseur_update_vitesse (void)
{