/*
 * DAC.cpp
 *
 *  Created on: Jun 25, 2023
 *      Author: Carst
 */

#include <stm32g0xx_ll_gpio.h>
#include <stm32g0xx_ll_dac.h>
#include "DAC.hpp"

namespace ElektronischeLast
{
  void iDAC::init()
  {
    /**DAC1 GPIO Configuration
    PA4   ------> DAC1_OUT1
    PA5   ------> DAC1_OUT2
    */
    LL_GPIO_InitTypeDef GPIO_InitStruct = {
      .Pin = LL_GPIO_PIN_4,
      .Mode = LL_GPIO_MODE_ANALOG,
      .Pull = LL_GPIO_PULL_NO,
    };
    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
    LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /** DAC channel OUT1 config
    */
    LL_DAC_InitTypeDef DAC_InitStruct = {
      .TriggerSource = LL_DAC_TRIG_SOFTWARE,
      .WaveAutoGeneration = LL_DAC_WAVE_AUTO_GENERATION_NONE,
      .OutputBuffer = LL_DAC_OUTPUT_BUFFER_ENABLE,
      .OutputConnection = LL_DAC_OUTPUT_CONNECT_GPIO,
      .OutputMode = LL_DAC_OUTPUT_MODE_NORMAL,
    };
    LL_DAC_Init(DAC1, LL_DAC_CHANNEL_1, &DAC_InitStruct);
    LL_DAC_DisableTrigger(DAC1, LL_DAC_CHANNEL_1);
    LL_DAC_EnableDMAReq(DAC1, LL_DAC_CHANNEL_1);
    LL_DAC_Enable(DAC1, LL_DAC_CHANNEL_1);

    /** DAC channel OUT2 config
    */
    LL_DAC_Init(DAC1, LL_DAC_CHANNEL_2, &DAC_InitStruct);
    LL_DAC_DisableTrigger(DAC1, LL_DAC_CHANNEL_2);
    LL_DAC_Enable(DAC1, LL_DAC_CHANNEL_2);
  }

  void iDAC::write(DAC_CHANNEL channel, uint32_t data)
  {
    LL_DAC_ConvertData12RightAligned(DAC, /*(channel == CHANNEL_1) ?*/ LL_DAC_CHANNEL_1 /*: LL_DAC_CHANNEL_2*/, data);
  }
}