-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFSMLumieres.h
71 lines (59 loc) · 3.51 KB
/
FSMLumieres.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Lumieres::FSMlumieres.h
// Exemple pour le forum 3rails / Julie Dumortier / Licence GPL
//
// Ce fichier concerne la machine à état fini pour gérer l'automatisme, la scène
// et plus généralement un ensemble d'éclairages
// === En principe vous n'avez pas à modifier ce fichier =======================
// Pour définir une séquence, on doit pour chaque éclairage définir une durée
// d'allumage avant extinction, et il existe des commandes particulières :
const byte _UNSET = -1; /* force l'extinction d'un éclairage, notamment précédemment marqué comme permanent */
const byte _SET = 0; /* lance les éclairages selon la durée définie */
const byte _STANDBY = 1; /* durée par tirage aléatoire en minutes (1 à n minutes) */
const byte _PERM = 2; /* durée permanente : jusqu'à l'arrêt de l'Arduino ou le changement de séquence */
const byte _ALEA = 3; /* durée aléatoire : permet de rendre aléatoire la présence d'une personne dans un bureau la nuit, aligné sur la commande précédente : STANDBY ou PERM */
const byte _WAIT = 4; /* pause d'une durée définie, ne touche à aucun éclairage */
const byte _WSTOP = 5; /* pause d'une durée indéfinie, ne touche à aucun éclairage, attends que l'entrée startPin passe à l'état LOW */
const byte _PWM = 6; /* envoie le signal sur la sortie si compatible : D3, D5, D6, D9, D10 et D11 */
const byte _ATTACH = 7; /* attache sortie(s) et entrée et gère les éclairages selon l'état de cette entrée */
const byte _DETACH = 8; /* supprime le lien existant entre éclairages et l'état d'une entrée */
const byte _SETMODE = 9; /* change le mode de configuration d'une sortie - cf ETYPE_xxx */
const byte _UNTIL = 10; /* lance les éclairages pendant la durée définie */
const byte _END = 99; /* marqueur de fin de séquence */
const byte _LOOP = 88; /* marqueur de boucle pour redémarrer sur le MARK */
const byte _MARK = 77; /* place le marqueur pour le LOOP */
const byte _RESET = 66; /* redémarre la FSM */
// Pointeur vers la séquence en cours, une séquence étant une suite de couple (éclairages, durée, commande)
byte* gpSeq;
// Timeout général sur MARK et sur WSTOP
long int gMARKTimeout;
long int gWSTOPTimeout;
// Configuration des E/S (valeurs par défaut)
byte gCnf[maxOutputs] = {
/* D2 */ ETYPE_STANDARD, /* S1 (1) : sortie standard (IO) *
/* D3 */ ETYPE_STANDARD, /* S2 (2) : sortie standard (PWM) */
/* D4 */ ETYPE_STANDARD, /* S3 (4) : sortie standard (IO) */
/* D5 */ ETYPE_STANDARD, /* S4 (8) : sortie standard (PWM) */
/* D6 */ ETYPE_STANDARD, /* S5 (16) : sortie standard (PWM) */
/* D9 */ ETYPE_STANDARD, /* S6 (32) ou SM1 : sortie standard (PWM) */
/* D10 */ ETYPE_STANDARD, /* S7 (64) ou SM2 : sortie standard (PWM) */
/* D11 */ ETYPE_STANDARD /* S8 (128) : sortie standard (PWM) */
};
// Pointeur vers la mark
byte* gpMarkSeq;
// machine à état des séquences
const byte START = 0; /* état initial */
const byte RUNNING = 1; /* état courant */
const byte STOP = 99; /* état final, atteint lorsaue la FSM rencontre le marqueur END */
// état de la FSM : START, RUNNING ou STOP
byte gSeqState;
// état de l'entrée notifiant qu'il faut démarrer ou stopper la FSM
bool gCurrentStateStartPin;
// parametres de l'automate
struct {
long int duration; /* durée avant la transition */
byte leds; /* leds concernés par la transition */
byte command; /* commande associée */
} gSeq;
// anti rebond des entrées
byte inputState[maxInputs];
byte inputCount[maxInputPins];