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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| class Arme {
enum t_etatArme : uint8_t {enInitialisation, enAttente, enTir};
public:
Arme(const char * nom, const uint8_t pin, const uint8_t nbCoups = 5, const uint32_t entre2Tirs = 15, const uint32_t entre2Rafales = 5000, const uint32_t dureeFlash = 30) :
_nom(nom),
_pin(pin),
_nbCoups(nbCoups),
_entre2Tirs(entre2Tirs),
_entre2Rafales(entre2Rafales),
_dureeFlash(dureeFlash)
{
etat = enInitialisation;
}
void begin() {
pinMode(_pin, OUTPUT);
chrono = -_entre2Rafales; // pour commencer à tirer plus vite
}
void gestionTir() {
switch (etat) {
case enInitialisation:
duree = _entre2Rafales + random(_entre2Rafales);
chrono = millis();
etat = enAttente;
nombreDeTirs = 0;
break;
case enAttente:
if (millis() - chrono >= duree) { // l'attente est finie
digitalWrite(_pin, HIGH);
Serial.print(_nom); Serial.println(" en tir");
chrono = millis();
etat = enTir;
}
break;
case enTir:
if (millis() - chrono >= _dureeFlash) { // on allume le canon 30ms
digitalWrite(_pin, LOW);
if (++nombreDeTirs >= _nbCoups) etat = enInitialisation; // on a fini la rafale
else {
duree = _entre2Tirs;
chrono = millis();
etat = enAttente;
}
}
break;
}
}
private:
const char * _nom;
uint8_t _pin;
uint8_t _nbCoups;
uint32_t _entre2Tirs;
uint32_t _entre2Rafales;
uint32_t _dureeFlash;
t_etatArme etat;
uint32_t chrono;
uint32_t duree;
uint8_t nombreDeTirs;
};
Arme lesArmes[] = {
// nom, pin, nb Coups dans une rafale, pause entre 2 Tirs d'une rafale, pause min entre 2 rafales, durée d'un flash
{ "Canon", 3, 1, 0, 5000, 30},
{ "Lance Flamme", 5, 3, 1000, 5000, 200},
{ "Marcheur", 6, 10, 15, 3000, 20},
{ "Droid", 9, 20, 20, 5000, 10},
{ "Missile", 10, 1, 0, 4000, 100},
{ "Vaisseau", 11, 4, 100, 1000, 50},
};
void setup() {
Serial.begin(115200);
Serial.println();
for (auto && arme : lesArmes) arme.begin();
}
void loop() {
for (auto && arme : lesArmes) arme.gestionTir();
} |
Partager