/* --------------------------------------------------------------
Application: 01 - Rev1
Release Type: Sub - Optimal Baseline Code
Class: Real Time Systems - Su 2025
AI Use: Commented inline
---------------------------------------------------------------*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED_PIN GPIO_NUM_4 // changed per challenge to GPIO 4
#define LED_OFF 0
#define LED_ON 1
#define SHORT_DURATION 250 // tested to work as low as 150, but for 125, period indicated is 120 !
#define LONG_DELAY 10000
#define TINY_DELAY 50
// Global LED state variable
int ledState = LED_OFF;
// Utility function to log with timestamp
void log_task_event(const char *taskName, const char *eventType, TickType_t periodTicks) {
TickType_t now = xTaskGetTickCount();
unsigned long time_ms = now * portTICK_PERIOD_MS;
unsigned long period_ms = periodTicks * portTICK_PERIOD_MS;
printf("[%8lu ms] %s: %s | Period: %lu ms\n",
time_ms, taskName, eventType, period_ms);
}
void Beacon_xmit_task(void *pvParameters) {
TickType_t lastWakeTime = xTaskGetTickCount(); // Initial timestamp
while (1) {
ledState = !ledState;
gpio_set_level(LED_PIN, ledState);
TickType_t now = xTaskGetTickCount();
//printf("Beacon Transmit Task period: %lu ms\t", (unsigned long)((now - lastWakeTime) * portTICK_PERIOD_MS));
log_task_event("XmitTask", ledState ? "LED ON" : "LED OFF", now - lastWakeTime);
lastWakeTime = now;
vTaskDelay(pdMS_TO_TICKS(SHORT_DURATION));
}
}
void Monitor_task(void *pvParameters) {
TickType_t lastWakeTime = xTaskGetTickCount(); // Initial timestamp
while (1) {
TickType_t now = xTaskGetTickCount();
//printf("\n");
//printf("MonitorTask period: %lu ms | System time: %lu ms | LED = %s\n",
// (unsigned long)((now - lastWakeTime) * portTICK_PERIOD_MS),
// (unsigned long)(now * portTICK_PERIOD_MS),
// ledState ? "ON" : "OFF");
char msg[64];
snprintf(msg, sizeof(msg), "Alive | LED = %s", ledState ? "ON" : "OFF");
log_task_event("MonitorTask", msg, now - lastWakeTime);
lastWakeTime = now;
vTaskDelay(pdMS_TO_TICKS(TINY_DELAY));
// vTaskDelay(pdMS_TO_TICKS(LONG_DELAY));
}
}
void app_main() {
gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
// Initially start with a LED_OFF
gpio_set_level(LED_PIN, ledState); // Ensure it starts in the OFF state
xTaskCreate(Beacon_xmit_task, "BeaconXmitTask", 2048, NULL, 1, NULL);
xTaskCreate(Monitor_task, "MonitorTask", 2048, NULL, 1, NULL);
}