// Project: pa blink
// Copyright (c) 2023-2024, Framework Labs
#include "proto_activities.h"
// Common activities
/* Toggles a state on each positive edge of trigger. */
pa_activity (EdgeTriggeredToggle, pa_ctx(), bool trigger, bool& val) {
val = false;
pa_every (trigger) {
val = !val;
pa_await (!trigger);
} pa_every_end;
} pa_activity_end;
// Button
void initButton(unsigned pin) {
pinMode(pin, INPUT_PULLUP);
}
bool readButton(unsigned pin) {
return digitalRead(pin) == LOW;
}
/* Continuously reads and returns the button pressed state. */
pa_activity (ButtonReader, pa_ctx_tm(), unsigned pin, bool& pressed) {
initButton(pin);
pa_repeat {
pressed = readButton(pin);
pa_delay_ms (100);
}
} pa_end;
// Led
void initLed(unsigned pin) {
pinMode(pin, OUTPUT);
}
void setLed(unsigned pin) {
digitalWrite(pin, HIGH);
}
void clearLed(unsigned pin) {
digitalWrite(pin, LOW);
}
/* Blinks an led of given pin with given on-tick and off-tick intervals. */
pa_activity (Blinker, pa_ctx_tm(pa_defer_res), unsigned pin, unsigned onTimeMs, unsigned offTimeMs) {
initLed(pin);
pa_defer {
clearLed(pin);
};
pa_repeat {
setLed(pin);
pa_delay_ms (onTimeMs);
clearLed(pin);
pa_delay_ms (offTimeMs);
}
} pa_end
/* Alternates Blinking the led slow and quickly. */
pa_activity (AlternatingBlinker, pa_ctx_tm(pa_use(Blinker)), unsigned pin) {
pa_repeat {
/* Blink slowly for 3 second */
pa_after_s_abort (3, Blinker, pin, 500, 500);
/* Blink quickly for 2 second */
pa_after_s_abort (2, Blinker, pin, 200, 200);
}
} pa_end
/* Starts and stops the alternating blinker depending on the on value. */
pa_activity (BlinkerController, pa_ctx(pa_use(AlternatingBlinker)), unsigned pin, bool on) {
pa_whenever (on, AlternatingBlinker, pin);
} pa_end
// Main
/* Sets up a button reader, a state toggle and the blinker controller. */
pa_activity (Main, pa_ctx(pa_co_res(3); pa_use(ButtonReader); pa_use(EdgeTriggeredToggle); pa_use(BlinkerController);
bool pressed; bool isOn)) {
pa_co(3) {
pa_with (ButtonReader, 4, pa_self.pressed);
pa_with (EdgeTriggeredToggle, pa_self.pressed, pa_self.isOn);
pa_with (BlinkerController, 2, pa_self.isOn);
} pa_co_end
} pa_end
// Setup and Loop
pa_use(Main);
void setup() {
Serial.begin(9600);
}
void loop() {
pa_tick(Main);
delay(100); // only to make simulation more performaant
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
led1:A
led1:C
r1:1
r1:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r