#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>

void LED_Init(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
    GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
    EDIS;
}

Void taskFxn(UArg a0, UArg a1)
{
    System_printf("Task started ...\n");
    System_flush();

    LED_Init();

    while (1)
    {
        GpioDataRegs.GPATOGGLE.bit.GPIO4 = 1; // Toggle GPIO0 once per 500 milliseconds
        GpioDataRegs.GPATOGGLE.bit.GPIO5 = 1; // Toggle GPIO1 once per 500 milliseconds
        GpioDataRegs.GPATOGGLE.bit.GPIO6 = 1; // Toggle GPIO2 once per 500 milliseconds
        GpioDataRegs.GPATOGGLE.bit.GPIO7 = 1; // Toggle GPIO3 once per 500 milliseconds

        Task_sleep(1000);

        System_printf("Task running ...\n");
        System_flush();
    }

    System_printf("Task Done.\n");

    System_flush();
}

Int main()
{
    // Initialize the peripheral clocks
    InitPeripheralClocks();

    Task_Handle task;
    Error_Block eb;

    Error_init(&eb);
    task = Task_create(taskFxn, NULL, &eb);
    if (task == NULL)
    {
        System_printf("Failed to create task. Stop.\n");
        BIOS_exit(0);
    }

    BIOS_start();

    return(0);
}
