#include "stm32c0xx.h"

// Function prototypes
void UART1_Init(void);
void UART1_Receive(void);
void LED_Init(void);
void LED_On(void);
void LED_Off(void);

char received_data[100];
volatile int index_1 = 0;

int main(void) {
    UART1_Init();
    LED_Init();
    Serial.begin(115200);
    Serial.print("hello");
    while (1) {
        UART1_Receive(); // Receive data from UART
        
        // Check the received command and control LED accordingly
        if (received_data[0] == 'O' && received_data[1] == 'N' && received_data[2] == '\0') {
            LED_On();
        } else if (received_data[0] == 'O' && received_data[1] == 'F' && received_data[2] == 'F' && received_data[3] == '\0') {
            LED_Off();
        }
        
        // Clear received data buffer
        for (int i = 0; i < 100; i++) {
            received_data[i] = 0;
        }
        index_1 = 0;
    }
}

void UART1_Init(void) {
    // Enable GPIOA and USART1 clocks
    RCC->AHBENR |= RCC_IOPENR_GPIOAEN;
    RCC->AHBENR |= RCC_APBENR2_USART1EN;
    
    // Configure PA2 (TX) and PA3 (RX) for USART1
    GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3); // Clear mode bits
    GPIOA->MODER |= (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1); // Set to alternate function mode
    GPIOA->AFR[0] |= (4 << GPIO_AFRL_AFSEL2_Pos) | (4 << GPIO_AFRL_AFSEL3_Pos); // AF4 for USART1

    // Configure USART1
    USART1->BRR = 0x1A1; // Baud rate 115200 (assuming 16MHz clock, adjust if different)
    USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE; // Enable TX, RX, and USART
}

void UART1_Receive(void) {
    while (!(USART1->ISR & USART_ISR_NE)); // Wait until RXNE (Receive Data Register Not Empty) is set
    received_data[index_1++] = USART1->RDR; // Read received data
    if (received_data[index_1-1] == '\n' || index_1 >= 100) { // End of command or buffer full
        received_data[index_1-1] = '\0'; // Null-terminate the string
        index_1= 0; // Reset index
    }
}

void LED_Init(void) {
    // Enable GPIOA clock
    RCC->AHBENR |= RCC_IOPENR_GPIOAEN;
    
    // Configure PA5 as output
    GPIOA->MODER &= ~GPIO_MODER_MODE5; // Clear mode bits for PA5
    GPIOA->MODER |= GPIO_MODER_MODE5_0; // Set to general purpose output mode
}

void LED_On(void) {
    GPIOA->ODR |= GPIO_ODR_OD5; // Set PA5 high
}

void LED_Off(void) {
    GPIOA->ODR &= ~GPIO_ODR_OD5; // Set PA5 low
}
nucleo:PD0
nucleo:PD2
nucleo:VDD
nucleo:PA14
nucleo:PA13
nucleo:PC6
nucleo:GND.1
nucleo:PC13
nucleo:PC14
nucleo:PF0
nucleo:PF1
nucleo:PB11
nucleo:PA2
nucleo:PD1
nucleo:PD2.2
nucleo:E5V
nucleo:GND.2
nucleo:IOREF.1
nucleo:NRST.1
nucleo:3V3.1
nucleo:5V.1
nucleo:GND.3
nucleo:GND.4
nucleo:VIN.1
nucleo:PA0
nucleo:PA1
nucleo:PA4
nucleo:PB1
nucleo:PA11
nucleo:PA12
nucleo:IOREF.2
nucleo:NRST.2
nucleo:3V3.2
nucleo:5V.2
nucleo:GND.5
nucleo:GND.6
nucleo:VIN.2
nucleo:A0
nucleo:A1
nucleo:A2
nucleo:A3
nucleo:A4
nucleo:A5
nucleo:5V.3
nucleo:PA3
nucleo:PC15
nucleo:PB12.1
nucleo:PB12.2
nucleo:PB2
nucleo:GND.7
nucleo:PF3
nucleo:PA8
nucleo:PB15
nucleo:PB14
nucleo:PB13
nucleo:AGND
nucleo:PB0.1
nucleo:PD3
nucleo:PB8
nucleo:PB9
nucleo:AVDD.1
nucleo:GND.8
nucleo:PA5
nucleo:PA6
nucleo:PA7
nucleo:PB0.2
nucleo:PC7
nucleo:PA9
nucleo:PA15
nucleo:PB5
nucleo:PB4
nucleo:PB10
nucleo:PB3
nucleo:PA10
nucleo:PB6
nucleo:PB7
nucleo:D15
nucleo:D14
nucleo:AVDD.2
nucleo:GND.9
nucleo:D13
nucleo:D12
nucleo:D11
nucleo:D10
nucleo:D9
nucleo:D8
nucleo:D7
nucleo:D6
nucleo:D5
nucleo:D4
nucleo:D3
nucleo:D2
nucleo:D1
nucleo:D0
D0D1D2D3D4D5D6D7GNDLOGIC
logic1:D0
logic1:D1
logic1:D2
logic1:D3
logic1:D4
logic1:D5
logic1:D6
logic1:D7
logic1:GND
led1:A
led1:C