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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| static TaskHandle_t xledTask = NULL;
#define RESET_0 0b1 #define LEDBIT_1 0b10 #define LEDBIT_2 0b100 #define LEDBIT_3 0b1000 #define LEDBIT_4 0b10000 #define LEDBIT_5 0b100000 #define LEDBIT_6 0b1000000 #define LEDBIT_7 0b10000000 #define LEDBIT_8 0b100000000 #define LEDBIT_9 0b1000000000
void dialTask(void * pvParam) { const byte INDIALPIN = 33; const byte PULSEPIN = 32; pinMode(INDIALPIN, INPUT_PULLUP); pinMode(PULSEPIN, INPUT_PULLUP);
byte counter = 0; boolean inDialPinLastState; boolean pulsPinLastState;
inDialPinLastState = digitalRead(INDIALPIN); pulsPinLastState = digitalRead(PULSEPIN);
while (1) {
boolean inDialPinState = digitalRead(INDIALPIN); boolean pulsPinState = digitalRead(PULSEPIN); if (inDialPinState != inDialPinLastState) { if (!inDialPinState) { counter = 0; } else { if (counter) { counter = counter % 10; uint32_t ulEventGroup; switch (counter) { case 0: ulEventGroup = RESET_0 ; break; case 1: ulEventGroup = LEDBIT_1 ; break; case 2: ulEventGroup = LEDBIT_2 ; break; case 3: ulEventGroup = LEDBIT_3 ; break; case 4: ulEventGroup = LEDBIT_4 ; break; case 5: ulEventGroup = LEDBIT_5 ; break; case 6: ulEventGroup = LEDBIT_6 ; break; case 7: ulEventGroup = LEDBIT_7 ; break; case 8: ulEventGroup = LEDBIT_8 ; break; case 9: ulEventGroup = LEDBIT_9 ; break; default: ulEventGroup = RESET_0 ; break; }
xTaskNotify( xledTask, ulEventGroup, eSetBits);
} } inDialPinLastState = inDialPinState; } if (pulsPinLastState != pulsPinState) { if (!pulsPinLastState) { counter++; } pulsPinLastState = pulsPinState; } }
}
void ledTask(void *pvParam) {
byte led_pins[9] = {23, 22, 21, 19, 18, 5, 15, 16, 4}; for (byte pin : led_pins) pinMode(pin, OUTPUT);
uint32_t ulNotifiedValue;
while (1) {
xTaskNotifyWait( pdFALSE, ULONG_MAX, &ulNotifiedValue, portMAX_DELAY );
if (ulNotifiedValue & (1 << 0) == 1) { for (int i = 1; i <= 9; i++) { digitalWrite(led_pins[i - 1], LOW); } }
for (int i = 1; i <= 9; i++) { if (ulNotifiedValue & (1 << i)) { digitalWrite(led_pins[i - 1], HIGH); } }
} }
void setup() { Serial.begin(115200);
xTaskCreate(dialTask, "Dial Panel", 1024 * 10, NULL, 1, NULL); xTaskCreate(ledTask, "Nine LED", 1024 * 10, NULL, 1, &xledTask);
}
void loop() { }
|