]> git.piffa.net Git - sketchbook_andrea/blob - multitasking/BlinkWithoutDelay_8_struct_pointer/BlinkWithoutDelay_8_struct_pointer.ino
Clean up multitasking, bottoni con pooling e interrupts
[sketchbook_andrea] / multitasking / BlinkWithoutDelay_8_struct_pointer / BlinkWithoutDelay_8_struct_pointer.ino
1 /* Blink without Delay
2  
3  Struct con pointer
4  
5  La funzione lightLed() ora passa un pointer alla posizione di memoria
6  della struttura dati ledA / ledB, non viene fatta una copia di
7  tutto lo struct ledA --> temp per poi far tornare (return(temp))
8  una struttura aggiornate di temp che vera' nuovamente copiata 
9  sull'originale ledA.
10  
11  Viene fatta un pass by reference e non un pass by value,
12  vengono usate meno risose di calcolo e meno memoria.
13  */
14
15 struct blinkLed {
16   // Lampeggia un LED utilizzando millis()
17   // Variabili
18   int ledPin ;           // il numero del LED pin
19   int ledState ;         // stato attuale del LED
20   long interval ;        // milliseconds di intervallo nel lampeggiare
21   long previousMillis ;  //precedente cambio di stato  
22 };
23 // Instanziamo i due led dalla struttura
24 blinkLed ledA = {
25   13 , LOW , 1000, 0 };
26 blinkLed ledB = {
27   12, LOW, 500, 0};
28
29 void setup() {
30   pinMode(ledA.ledPin, OUTPUT);
31   pinMode(ledB.ledPin, OUTPUT);
32 }
33
34 void loop()
35 {
36  lightLed(&ledA ); // Viene passato il riferimento (Left value) di ledA
37  lightLed(&ledB );
38 }
39
40 ////////////////
41 // Funzioni
42
43 void lightLed(struct blinkLed *temp) { // temp ora e' un pointer e non una copia autonoma: pass by reference (not by value)
44 // Si noti che la funzione e' ora void dato che non deve tornare a passare nulla al loop: molto
45 piu' semplice (una sorta di polimorfismo).
46   
47   // Illumina il ledA secondo un intervallo passato come argomento
48
49   if(millis() - (*temp).previousMillis >= (*temp).interval) { // l'operatore punto ha priorita' maggiore rispetto al pointer asterisco
50     (*temp).previousMillis += (*temp).interval ;
51
52     // if the LED is off turn it on and vice-versa:
53     temp->ledState = !temp->ledState ; // Forma contratta, deference operator: temp->ledState == (*temp).ledState
54   }
55   digitalWrite(temp->ledPin, temp->ledState);
56   //return(temp); // copy by value
57 }
58
59
60