/*
 * Copyright (c) 2023, Texas Instruments Incorporated
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * *  Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * *  Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * *  Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 *  ============ ti_msp_dl_config.c =============
 *  Configured MSPM0 DriverLib module definitions
 *
 *  DO NOT EDIT - This file is generated for the MSPM0L222X
 *  by the SysConfig tool.
 */

#include "ti_msp_dl_config.h"

/*
 *  ======== SYSCFG_DL_init ========
 *  Perform any initialization needed before using any board APIs
 */
SYSCONFIG_WEAK void SYSCFG_DL_init(void)
{
    SYSCFG_DL_initPower();
    SYSCFG_DL_GPIO_init();
    /* Module-Specific Initializations*/
    SYSCFG_DL_SYSCTL_init();
    SYSCFG_DL_I2C_init();
    SYSCFG_DL_CONSOLE_UART_init();
    SYSCFG_DL_NBIOT_UART_init();
    SYSCFG_DL_BLE_UART_init();
    SYSCFG_DL_IR_UART_init();
    SYSCFG_DL_SUPPLY_SOH_ADC_init();

    SYSCFG_DL_LCD_init();
}

SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
{
    DL_GPIO_reset(GPIOA);
    DL_GPIO_reset(GPIOB);
    DL_GPIO_reset(GPIOC);
    DL_I2C_reset(I2C_INST);
    DL_UART_Main_reset(CONSOLE_UART_INST);
    DL_UART_Main_reset(NBIOT_UART_INST);
    DL_UART_Main_reset(BLE_UART_INST);
    DL_UART_Main_reset(IR_UART_INST);
    DL_ADC12_reset(SUPPLY_SOH_ADC_INST);
    DL_AESADV_reset(AESADV);
    DL_LCD_reset(LCD);

    DL_GPIO_enablePower(GPIOA);
    DL_GPIO_enablePower(GPIOB);
    DL_GPIO_enablePower(GPIOC);
    DL_I2C_enablePower(I2C_INST);
    DL_UART_Main_enablePower(CONSOLE_UART_INST);
    DL_UART_Main_enablePower(NBIOT_UART_INST);
    DL_UART_Main_enablePower(BLE_UART_INST);
    DL_UART_Main_enablePower(IR_UART_INST);
    DL_ADC12_enablePower(SUPPLY_SOH_ADC_INST);
    DL_AESADV_enablePower(AESADV);
    DL_LCD_enablePower(LCD);
    delay_cycles(POWER_STARTUP_DELAY);
}

SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
{

    DL_GPIO_initPeripheralInputFunctionFeatures(GPIO_I2C_IOMUX_SDA,
        GPIO_I2C_IOMUX_SDA_FUNC, DL_GPIO_INVERSION_DISABLE,
        DL_GPIO_RESISTOR_NONE, DL_GPIO_HYSTERESIS_DISABLE,
        DL_GPIO_WAKEUP_DISABLE);
    DL_GPIO_initPeripheralInputFunctionFeatures(GPIO_I2C_IOMUX_SCL,
        GPIO_I2C_IOMUX_SCL_FUNC, DL_GPIO_INVERSION_DISABLE,
        DL_GPIO_RESISTOR_NONE, DL_GPIO_HYSTERESIS_DISABLE,
        DL_GPIO_WAKEUP_DISABLE);
    DL_GPIO_enableHiZ(GPIO_I2C_IOMUX_SDA);
    DL_GPIO_enableHiZ(GPIO_I2C_IOMUX_SCL);

    
	DL_GPIO_initPeripheralOutputFunctionFeatures(
		 GPIO_CONSOLE_UART_IOMUX_TX, GPIO_CONSOLE_UART_IOMUX_TX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
	DL_GPIO_initPeripheralInputFunctionFeatures(
		 GPIO_CONSOLE_UART_IOMUX_RX, GPIO_CONSOLE_UART_IOMUX_RX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
    
	DL_GPIO_initPeripheralOutputFunctionFeatures(
		 GPIO_NBIOT_UART_IOMUX_TX, GPIO_NBIOT_UART_IOMUX_TX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
	DL_GPIO_initPeripheralInputFunctionFeatures(
		 GPIO_NBIOT_UART_IOMUX_RX, GPIO_NBIOT_UART_IOMUX_RX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
    
	DL_GPIO_initPeripheralOutputFunctionFeatures(
		 GPIO_BLE_UART_IOMUX_TX, GPIO_BLE_UART_IOMUX_TX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
	DL_GPIO_initPeripheralInputFunctionFeatures(
		 GPIO_BLE_UART_IOMUX_RX, GPIO_BLE_UART_IOMUX_RX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
    
	DL_GPIO_initPeripheralOutputFunctionFeatures(
		 GPIO_IR_UART_IOMUX_TX, GPIO_IR_UART_IOMUX_TX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
	DL_GPIO_initPeripheralInputFunctionFeatures(
		 GPIO_IR_UART_IOMUX_RX, GPIO_IR_UART_IOMUX_RX_FUNC,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalOutput(EXT_OUT_LCD_BACKLIGHT_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_IN2_VALVE_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_IN1_VALVE_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_EEPROM_LOAD_SW_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_IOT_LOAD_SW_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_BATTERY_LOAD_SW_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_SUPER_CAP_LOAD_SW_IOMUX);

    DL_GPIO_initDigitalOutput(EXT_OUT_PULSE_LED_IOMUX);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_CAP_TOUCH_1_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_H2_SENSOR_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_H1_SENSOR_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_MAGNET_TAMPER_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_TILT_TAMPER_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_DOWN,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_MAIN_COVER_OPEN_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_BATTERY_DETECT_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_BLE_OUT_INT_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_LORA_IN_INT_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_BATTERY_COVER_TAMPER_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_initDigitalInputFeatures(EXT_IN_CAP_TOUCH_2_IOMUX,
		 DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_NONE,
		 DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);

    DL_GPIO_clearPins(GPIOA, EXT_OUT_IN2_VALVE_PIN |
		EXT_OUT_EEPROM_LOAD_SW_PIN |
		EXT_OUT_BATTERY_LOAD_SW_PIN |
		EXT_OUT_SUPER_CAP_LOAD_SW_PIN);
    DL_GPIO_enableOutput(GPIOA, EXT_OUT_IN2_VALVE_PIN |
		EXT_OUT_EEPROM_LOAD_SW_PIN |
		EXT_OUT_BATTERY_LOAD_SW_PIN |
		EXT_OUT_SUPER_CAP_LOAD_SW_PIN);
    DL_GPIO_setLowerPinsPolarity(GPIOA, DL_GPIO_PIN_7_EDGE_RISE);
    DL_GPIO_setUpperPinsPolarity(GPIOA, DL_GPIO_PIN_18_EDGE_RISE |
		DL_GPIO_PIN_16_EDGE_RISE);
    DL_GPIO_clearInterruptStatus(GPIOA, EXT_IN_H2_SENSOR_PIN |
		EXT_IN_MAGNET_TAMPER_PIN |
		EXT_IN_BATTERY_COVER_TAMPER_PIN);
    DL_GPIO_enableInterrupt(GPIOA, EXT_IN_H2_SENSOR_PIN |
		EXT_IN_MAGNET_TAMPER_PIN |
		EXT_IN_BATTERY_COVER_TAMPER_PIN);
    DL_GPIO_clearPins(GPIOB, EXT_OUT_LCD_BACKLIGHT_PIN |
		EXT_OUT_IOT_LOAD_SW_PIN |
		EXT_OUT_PULSE_LED_PIN);
    DL_GPIO_enableOutput(GPIOB, EXT_OUT_LCD_BACKLIGHT_PIN |
		EXT_OUT_IOT_LOAD_SW_PIN |
		EXT_OUT_PULSE_LED_PIN);
    DL_GPIO_setLowerPinsPolarity(GPIOB, DL_GPIO_PIN_10_EDGE_RISE |
		DL_GPIO_PIN_2_EDGE_RISE |
		DL_GPIO_PIN_6_EDGE_RISE |
		DL_GPIO_PIN_9_EDGE_RISE_FALL |
		DL_GPIO_PIN_8_EDGE_RISE |
		DL_GPIO_PIN_11_EDGE_RISE);
    DL_GPIO_clearInterruptStatus(GPIOB, EXT_IN_CAP_TOUCH_1_PIN |
		EXT_IN_H1_SENSOR_PIN |
		EXT_IN_TILT_TAMPER_PIN |
		EXT_IN_BATTERY_DETECT_PIN |
		EXT_IN_BLE_OUT_INT_PIN |
		EXT_IN_CAP_TOUCH_2_PIN);
    DL_GPIO_enableInterrupt(GPIOB, EXT_IN_CAP_TOUCH_1_PIN |
		EXT_IN_H1_SENSOR_PIN |
		EXT_IN_TILT_TAMPER_PIN |
		EXT_IN_BATTERY_DETECT_PIN |
		EXT_IN_BLE_OUT_INT_PIN |
		EXT_IN_CAP_TOUCH_2_PIN);
    DL_GPIO_clearPins(GPIOC, EXT_OUT_IN1_VALVE_PIN);
    DL_GPIO_enableOutput(GPIOC, EXT_OUT_IN1_VALVE_PIN);
    DL_GPIO_setLowerPinsPolarity(GPIOC, DL_GPIO_PIN_2_EDGE_RISE |
		DL_GPIO_PIN_4_EDGE_RISE);
    DL_GPIO_clearInterruptStatus(GPIOC, EXT_IN_MAIN_COVER_OPEN_PIN |
		EXT_IN_LORA_IN_INT_PIN);
    DL_GPIO_enableInterrupt(GPIOC, EXT_IN_MAIN_COVER_OPEN_PIN |
		EXT_IN_LORA_IN_INT_PIN);

}


SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
{

	//Low Power Mode is configured to be SLEEP0
    DL_SYSCTL_setBORThreshold(DL_SYSCTL_BOR_THRESHOLD_LEVEL_0);

    DL_SYSCTL_setSYSOSCFreq(DL_SYSCTL_SYSOSC_FREQ_BASE);
    DL_SYSCTL_setMCLKDivider(DL_SYSCTL_MCLK_DIVIDER_DISABLE);

}


static const DL_I2C_ClockConfig gI2CClockConfig = {
    .clockSel = DL_I2C_CLOCK_BUSCLK,
    .divideRatio = DL_I2C_CLOCK_DIVIDE_1,
};

SYSCONFIG_WEAK void SYSCFG_DL_I2C_init(void) {

    DL_I2C_setClockConfig(I2C_INST,
        (DL_I2C_ClockConfig *) &gI2CClockConfig);
    DL_I2C_disableAnalogGlitchFilter(I2C_INST);

    /* Configure Controller Mode */
    DL_I2C_resetControllerTransfer(I2C_INST);
    /* Set frequency to 100000 Hz*/
    DL_I2C_setTimerPeriod(I2C_INST, 31);
    DL_I2C_setControllerTXFIFOThreshold(I2C_INST, DL_I2C_TX_FIFO_LEVEL_BYTES_1);
    DL_I2C_setControllerRXFIFOThreshold(I2C_INST, DL_I2C_RX_FIFO_LEVEL_BYTES_1);
    DL_I2C_enableControllerClockStretching(I2C_INST);

    /* Configure Interrupts */
    DL_I2C_enableInterrupt(I2C_INST,
                           DL_I2C_INTERRUPT_CONTROLLER_ARBITRATION_LOST |
                           DL_I2C_INTERRUPT_CONTROLLER_NACK |
                           DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER |
                           DL_I2C_INTERRUPT_CONTROLLER_RX_DONE |
                           DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER |
                           DL_I2C_INTERRUPT_CONTROLLER_TX_DONE);


    /* Enable module */
    DL_I2C_enableController(I2C_INST);


}

static const DL_UART_Main_ClockConfig gCONSOLE_UARTClockConfig = {
    .clockSel    = DL_UART_MAIN_CLOCK_BUSCLK,
    .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gCONSOLE_UARTConfig = {
    .mode        = DL_UART_MAIN_MODE_NORMAL,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_CONSOLE_UART_init(void)
{
    DL_UART_Main_setClockConfig(CONSOLE_UART_INST, (DL_UART_Main_ClockConfig *) &gCONSOLE_UARTClockConfig);

    DL_UART_Main_init(CONSOLE_UART_INST, (DL_UART_Main_Config *) &gCONSOLE_UARTConfig);
    /*
     * Configure baud rate by setting oversampling and baud rate divisors.
     *  Target baud rate: 115200
     *  Actual baud rate: 115211.52
     */
    DL_UART_Main_setOversampling(CONSOLE_UART_INST, DL_UART_OVERSAMPLING_RATE_16X);
    DL_UART_Main_setBaudRateDivisor(CONSOLE_UART_INST, CONSOLE_UART_IBRD_32_MHZ_115200_BAUD, CONSOLE_UART_FBRD_32_MHZ_115200_BAUD);


    /* Configure Interrupts */
    DL_UART_Main_enableInterrupt(CONSOLE_UART_INST,
                                 DL_UART_MAIN_INTERRUPT_RX);


    DL_UART_Main_enable(CONSOLE_UART_INST);
}
static const DL_UART_Main_ClockConfig gNBIOT_UARTClockConfig = {
    .clockSel    = DL_UART_MAIN_CLOCK_BUSCLK,
    .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gNBIOT_UARTConfig = {
    .mode        = DL_UART_MAIN_MODE_NORMAL,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_NBIOT_UART_init(void)
{
    DL_UART_Main_setClockConfig(NBIOT_UART_INST, (DL_UART_Main_ClockConfig *) &gNBIOT_UARTClockConfig);

    DL_UART_Main_init(NBIOT_UART_INST, (DL_UART_Main_Config *) &gNBIOT_UARTConfig);
    /*
     * Configure baud rate by setting oversampling and baud rate divisors.
     *  Target baud rate: 115200
     *  Actual baud rate: 115211.52
     */
    DL_UART_Main_setOversampling(NBIOT_UART_INST, DL_UART_OVERSAMPLING_RATE_16X);
    DL_UART_Main_setBaudRateDivisor(NBIOT_UART_INST, NBIOT_UART_IBRD_32_MHZ_115200_BAUD, NBIOT_UART_FBRD_32_MHZ_115200_BAUD);


    /* Configure Interrupts */
    DL_UART_Main_enableInterrupt(NBIOT_UART_INST,
                                 DL_UART_MAIN_INTERRUPT_RX);


    DL_UART_Main_enable(NBIOT_UART_INST);
}
static const DL_UART_Main_ClockConfig gBLE_UARTClockConfig = {
    .clockSel    = DL_UART_MAIN_CLOCK_BUSCLK,
    .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gBLE_UARTConfig = {
    .mode        = DL_UART_MAIN_MODE_NORMAL,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_BLE_UART_init(void)
{
    DL_UART_Main_setClockConfig(BLE_UART_INST, (DL_UART_Main_ClockConfig *) &gBLE_UARTClockConfig);

    DL_UART_Main_init(BLE_UART_INST, (DL_UART_Main_Config *) &gBLE_UARTConfig);
    /*
     * Configure baud rate by setting oversampling and baud rate divisors.
     *  Target baud rate: 115200
     *  Actual baud rate: 115211.52
     */
    DL_UART_Main_setOversampling(BLE_UART_INST, DL_UART_OVERSAMPLING_RATE_16X);
    DL_UART_Main_setBaudRateDivisor(BLE_UART_INST, BLE_UART_IBRD_32_MHZ_115200_BAUD, BLE_UART_FBRD_32_MHZ_115200_BAUD);


    /* Configure Interrupts */
    DL_UART_Main_enableInterrupt(BLE_UART_INST,
                                 DL_UART_MAIN_INTERRUPT_RX);


    DL_UART_Main_enable(BLE_UART_INST);
}
static const DL_UART_Main_ClockConfig gIR_UARTClockConfig = {
    .clockSel    = DL_UART_MAIN_CLOCK_BUSCLK,
    .divideRatio = DL_UART_MAIN_CLOCK_DIVIDE_RATIO_1
};

static const DL_UART_Main_Config gIR_UARTConfig = {
    .mode        = DL_UART_MAIN_MODE_NORMAL,
    .direction   = DL_UART_MAIN_DIRECTION_TX_RX,
    .flowControl = DL_UART_MAIN_FLOW_CONTROL_NONE,
    .parity      = DL_UART_MAIN_PARITY_NONE,
    .wordLength  = DL_UART_MAIN_WORD_LENGTH_8_BITS,
    .stopBits    = DL_UART_MAIN_STOP_BITS_ONE
};

SYSCONFIG_WEAK void SYSCFG_DL_IR_UART_init(void)
{
    DL_UART_Main_setClockConfig(IR_UART_INST, (DL_UART_Main_ClockConfig *) &gIR_UARTClockConfig);

    DL_UART_Main_init(IR_UART_INST, (DL_UART_Main_Config *) &gIR_UARTConfig);
    /*
     * Configure baud rate by setting oversampling and baud rate divisors.
     *  Target baud rate: 115200
     *  Actual baud rate: 115211.52
     */
    DL_UART_Main_setOversampling(IR_UART_INST, DL_UART_OVERSAMPLING_RATE_16X);
    DL_UART_Main_setBaudRateDivisor(IR_UART_INST, IR_UART_IBRD_32_MHZ_115200_BAUD, IR_UART_FBRD_32_MHZ_115200_BAUD);


    /* Configure Interrupts */
    DL_UART_Main_enableInterrupt(IR_UART_INST,
                                 DL_UART_MAIN_INTERRUPT_RX);


    DL_UART_Main_enable(IR_UART_INST);
}

/* SUPPLY_SOH_ADC Initialization */
static const DL_ADC12_ClockConfig gSUPPLY_SOH_ADCClockConfig = {
    .clockSel       = DL_ADC12_CLOCK_SYSOSC,
    .divideRatio    = DL_ADC12_CLOCK_DIVIDE_1,
    .freqRange      = DL_ADC12_CLOCK_FREQ_RANGE_24_TO_32,
};
SYSCONFIG_WEAK void SYSCFG_DL_SUPPLY_SOH_ADC_init(void)
{
    DL_ADC12_setClockConfig(SUPPLY_SOH_ADC_INST, (DL_ADC12_ClockConfig *) &gSUPPLY_SOH_ADCClockConfig);

    DL_ADC12_initSeqSample(SUPPLY_SOH_ADC_INST,
        DL_ADC12_REPEAT_MODE_DISABLED, DL_ADC12_SAMPLING_SOURCE_AUTO, DL_ADC12_TRIG_SRC_SOFTWARE,
        DL_ADC12_SEQ_START_ADDR_00, DL_ADC12_SEQ_END_ADDR_02, DL_ADC12_SAMP_CONV_RES_12_BIT,
        DL_ADC12_SAMP_CONV_DATA_FORMAT_UNSIGNED);
    DL_ADC12_configConversionMem(SUPPLY_SOH_ADC_INST, SUPPLY_SOH_ADC_ADCMEM_BATT_SOH_ADC,
        DL_ADC12_INPUT_CHAN_31, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
        DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    DL_ADC12_configConversionMem(SUPPLY_SOH_ADC_INST, SUPPLY_SOH_ADC_ADCMEM_VALVE_CURRENT_ADC,
        DL_ADC12_INPUT_CHAN_9, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
        DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    DL_ADC12_configConversionMem(SUPPLY_SOH_ADC_INST, SUPPLY_SOH_ADC_ADCMEM_SUPERCAP_SOH_ADC,
        DL_ADC12_INPUT_CHAN_15, DL_ADC12_REFERENCE_VOLTAGE_VDDA, DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0, DL_ADC12_AVERAGING_MODE_DISABLED,
        DL_ADC12_BURN_OUT_SOURCE_DISABLED, DL_ADC12_TRIGGER_MODE_AUTO_NEXT, DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    /* Enable ADC12 interrupt */
    DL_ADC12_clearInterruptStatus(SUPPLY_SOH_ADC_INST,(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
    DL_ADC12_enableInterrupt(SUPPLY_SOH_ADC_INST,(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
    DL_ADC12_enableConversions(SUPPLY_SOH_ADC_INST);
}

static const DL_AESADV_Config gAESADV_config = {
    .mode = DL_AESADV_MODE_ECB,
    .direction = DL_AESADV_DIR_ENCRYPT,
    .ctr_ctrWidth = DL_AESADV_CTR_WIDTH_32_BIT,
    .cfb_fbWidth = DL_AESADV_FB_WIDTH_128,
    .ccm_ctrWidth = DL_AESADV_CCM_CTR_WIDTH_2_BYTES,
    .ccm_tagWidth = DL_AESADV_CCM_TAG_WIDTH_1_BYTE,
    .iv = NULL,
    .nonce = NULL,
    .lowerCryptoLength = 0,
    .upperCryptoLength = 0,
    .aadLength = 0,
};

SYSCONFIG_WEAK void SYSCFG_DL_AESADV_init(void)
{
    /*
     * The key must be initialized and loaded in the application code with
     * DL_AESADV_setKey. This must be done prior to SYSCFG_DL_AESADV_init,
     * which places the AES engine in the selected AES mode with all of the
     * necessary control context.
     */

    DL_AESADV_initECB(AESADV, (DL_AESADV_Config *) &gAESADV_config);
}

static const DL_LCD_Config gLCDConfig = {
    .frequencyDivider   = DL_LCD_FREQ_DIVIDE_4,
    .muxRate            = DL_LCD_MUX_RATE_8,
    .lowPowerWaveform   = DL_LCD_WAVEFORM_POWERMODE_STANDARD
};

SYSCONFIG_WEAK void SYSCFG_DL_LCD_init(void)
{
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_33);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_34);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_0);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_1);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_45);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_46);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_47);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_48);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_55);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_56);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_57);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_58);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_23);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_39);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_40);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_41);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_24);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_25);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_26);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_27);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_42);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_43);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_44);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_28);
    DL_LCD_setPinAsLCDFunction(LCD, DL_LCD_SEGMENT_LINE_29);
    DL_LCD_init(LCD, (DL_LCD_Config *) &gLCDConfig);
    DL_LCD_turnSegmentsOn(LCD);
    DL_LCD_setBiasVoltageSource(LCD, DL_LCD_BIAS_VOLTAGE_SOURCE_R33);
    DL_LCD_setR33source(LCD, DL_LCD_R33_SOURCE_INTERNAL);
    DL_LCD_enableInternalBias(LCD);
    DL_LCD_setInternalBiasPowerMode(LCD, DL_LCD_POWER_MODE_LOW);
    DL_LCD_setBias(LCD, DL_LCD_BIAS_ONE_FOURTH);

    DL_LCD_enableVBOOST(LCD);
    DL_LCD_clearAllMemoryRegs(LCD); //
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_55, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_56, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_57, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_58, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_23, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_39, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_40, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_41, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_24, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_25, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_26, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_27, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_42, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_43, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_44, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_28, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setMemory(LCD, DL_LCD_MEMORY_29, (DL_LCD_MEMORY_BIT_0
		 | DL_LCD_MEMORY_BIT_1
		 | DL_LCD_MEMORY_BIT_2
		 | DL_LCD_MEMORY_BIT_3
		 | DL_LCD_MEMORY_BIT_4
		 | DL_LCD_MEMORY_BIT_5
		 | DL_LCD_MEMORY_BIT_6
		 | DL_LCD_MEMORY_BIT_7));
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_33, DL_LCD_COM_0);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_34, DL_LCD_COM_1);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_0, DL_LCD_COM_2);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_1, DL_LCD_COM_3);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_45, DL_LCD_COM_4);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_46, DL_LCD_COM_5);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_47, DL_LCD_COM_6);
    DL_LCD_setPinAsCommon(LCD, DL_LCD_SEGMENT_LINE_48, DL_LCD_COM_7);
    DL_LCD_enable(LCD);
}

