#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>

#include <main.h>
#include <usart.h>
#include <adc.h>

#include <PontCoopScheduler.h>

#include <signal.h>
#include <loopCtrl.h>
#include <mbusComm.h>
#include <logger.h>
#include <frontend.h>

void my_setup_1() {
    schInit();
    logInit();
}

void my_errorHandler() {
    signal(LED_RED, ON);
}

void helloMeterbus(void *handle) {
    mbusCommRequest(0x5b, 80);
    // static char msg[] = "Hello";
    // HAL_UART_Transmit_IT(&mbusUart, &msg, strlen(msg));

}


void my_setup_2() {
    signal(LED_RED, OFF);
    signal(LED_GREEN, ON);

    frontendInit();
    frontendSetThreshold(240);

    schAdd(helloMeterbus, NULL, 0, 5000);
}

void my_loop() {
    signal(DEBUG_1, TOGGLE);

    schExec();
    logExec();
}

void SYSTICK_Callback() {
    schUpdate();
}

void HAL_GPIO_EXTI_Callback(uint16_t pin) {
    if (pin == Loop_Status_Pin) {
        loopStatusCallback();
    }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
    if (hadc == &frontendAdc) {
        frontendAdcCallback(hadc);   
    }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
logMsg("TX_CPLT");
    if (huart == &mbusUart) {
        mbusCommTxCpltCallback(huart);
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
logMsg("RX_CPLT");
    if (huart == &mbusUart) {
        mbusCommRxCpltCallback(huart);
    }
}