From f4ca429185eef4083a4ea3c013cd148a74aaee75 Mon Sep 17 00:00:00 2001 From: cheapie Date: Wed, 22 Jul 2026 20:37:26 -0500 Subject: Add pedestrian hybrid beacon --- c/phb/phb.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 c/phb/phb.c (limited to 'c/phb/phb.c') diff --git a/c/phb/phb.c b/c/phb/phb.c new file mode 100644 index 0000000..6f85d09 --- /dev/null +++ b/c/phb/phb.c @@ -0,0 +1,74 @@ +#include +#include +#include "rvcontroller-ecalls.h" + +bool streq(char *a, char *b) { + for (int i=0;a[i] != 0 || b[i] != 0;i++) { + if (a[i] != b[i]) { + return false; + } + } + return true; +} + +void sleep(uint32_t delay) { + //This will start having problems after about 130 years + //of uptime, but that's probably acceptable + uint32_t endtime = rdtime() + delay; + while (rdtime() < endtime) {} + return; +} + +bool checkdetector(void) { + char channelbuf[16]; + char msgbuf[16]; + while (digiline_bufferlevel() > 0) { + lightweight_mode(0); + digiline_receive(channelbuf,16,msgbuf,16); + if (streq(channelbuf,"detect")) { + return true; + } + } + lightweight_mode(1); + return false; +} + +void main() { + printstr("Ped Hybrid Beacon\n"); + printstr("for RVController\nInitializing HW\n"); + digiline_send("beacon","OFF"); + digiline_send("ped","RED"); + digiline_clearbuffer(); + while (true) { + printstr("Idle\n"); + lightweight_mode(1); + printstr("Lightweight: On\n"); + while (!checkdetector()) {} + printstr("Ped detected\nLightweight: Off\n"); + lightweight_mode(0); + printstr("Beacon: Flash Yellow\n"); + digiline_send("beacon","FLASHYELLOW"); + sleep(3); + printstr("Beacon: Yellow\n"); + digiline_send("beacon","YELLOW"); + sleep(5); + printstr("Beacon: Red\n"); + digiline_send("beacon","RED"); + sleep(1); + printstr("Ped: Walk\n"); + digiline_send("ped","GREEN"); + sleep(7); + digiline_clearbuffer(); + printstr("Ped: Flash DW\n"); + digiline_send("ped","FLASHRED"); + printstr("Beacon: Flash Red\n"); + digiline_send("beacon","FLASHRED"); + sleep(15); + printstr("Ped: Don't Walk\n"); + digiline_send("ped","RED"); + sleep(1); + printstr("Beacon: Off\n"); + digiline_send("beacon","OFF"); + sleep(15); + } +} -- cgit v1.2.3