/**
**************************************************************************
* @file stm32f4xx_matlab_gpio.c
* @brief Исходный код симулятора портов.
**************************************************************************
@details
Данный файл содержит функции для симуляции портов STM32F407xx.
**************************************************************************/
#include "stm32f4xx_matlab_gpio.h"
#include "modbus.h"
#include "pwm.h"

/**
  * @brief      Запись буфера выходов S-Function из GPIO.
  * @param      out_buff - указатель на буфер выходов S-Function.
  * @details    Функция для записи буфера выходов S-Function из GPIO. 
                После в @ref SIM_writeOutputs() из out_buff формируются выходы S-Function.

  * @attention  Тело функции пишется пользователем!
  */
void GPIO_to_SFUNC(real_T* out_buff)
{
    for (int i = 0; i < PORT_WIDTH; i++)
    {
        if (GPIOB->ODR & (1 << i))
        {
            out_buff[i] = 1;
        }

        if (GPIOD->ODR & (1 << i))
        {
            out_buff[PORT_WIDTH + i] = 1;
        }

        if (GPIOA->ODR & (1 << i))
        {
            out_buff[2*PORT_WIDTH + i] = 1;
        }
    }
}

/**
  * @brief      Считывание входов S-Function в МК.
  * @param      out_buff - указатель на буфер выходов S-Function.
  * @details    Функция для считывания входов S-Function в МК. 
                Можно абстрагироваться от считывания в GPIO и записывать напрямую в переменные МК.

  * @attention  Тело функции пишется пользователем!
  */
void SFUNC_to_GPIO(real_T* in)
{
    int i = 0;
    // write pwm ctrl registers
    for (i = 0; i < 6; i++)
    {
        pwm_ctrl[i] = in[i];
    }
    // write pwm ctrl coils
    if (in[i++] > 0.5)
    {
        MB_Set_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
    }
    else
    {
        MB_Reset_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
    }
    if (in[i++] > 0.5)
    {
        MB_Set_Coil_Local(coils_regs, COIL_PWM_BRIDGE_MODE);
    }
    else
    {
        MB_Reset_Coil_Local(coils_regs, COIL_PWM_BRIDGE_MODE);
    }
    if (in[i++] > 0.5)
    {
        MB_Set_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
    }
    else
    {
        MB_Reset_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
    }
    hpwm.PWM_Sine_Hz = in[i++];

}