/*******************************************************************************
 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Except as contained in this notice, the name of Maxim Integrated
 * Products, Inc. shall not be used except as stated in the Maxim Integrated
 * Products, Inc. Branding Policy.
 *
 * The mere transfer of this software does not imply any licenses
 * of trade secrets, proprietary technology, copyrights, patents,
 * trademarks, maskwork rights, or any other form of intellectual
 * property whatsoever. Maxim Integrated Products, Inc. retains all
 * ownership rights.
 *
 * $Date: 2018-09-04 22:13:32 +0000 (Tue, 04 Sep 2018) $
 * $Revision: 37649 $
 *
 ******************************************************************************/

/**
 * @file    main.c
 * @brief   Hello World!
 * @details This example uses the UART to print to a terminal and flashes an LED.
 */

/***** Includes *****/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "mxc_config.h"
#include "led.h"
#include "board.h"
#include "tmr_utils.h"
#include "i2c.h"
#include "rtc.h"
#include "spi.h"
#include "gpio.h"
#include "oled96.h"
#include "bhy.h"
#include "Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h"
#include "bhy_uc_driver.h"
#include "pmic.h"
#include "bme680.h"
#include "bma400.h"
#include "bosch.h"
#include "LCD/LCD_Driver.h"
#include "GUI_DEV/GUI_Paint.h"
#include "Fonts/fonts.h"
#include "image/image.h"
#include "tmr.h"

// Parameters for PWM output
#define PORT_PWM   PORT_0  // port
#define PIN_PWM    PIN_28   // pin
#define FREQ       200 // (Hz) 
//#define DUTY_CYCLE 75  // (%)  
#define DUTY_CYCLE 20  // (%)  
#define PWM_TIMER  MXC_TMR4  // must change PORT_PWM and PIN_PWM if changed


/***** Definitions *****/

#define I2C_DEVICE        MXC_I2C0_BUS0

#define SPI SPI2
#define SPI_SPEED       1000000  // Bit Rate

/***** Globals *****/
static const gpio_cfg_t motor_pin = {PORT_0, PIN_8, GPIO_FUNC_OUT, GPIO_PAD_NONE};
//const gpio_cfg_t DEV_RST_PIN = {PORT_0, PIN_28, GPIO_FUNC_OUT, GPIO_PAD_NONE};
const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE};

/***** Functions *****/
void PWM_Output()
{
    // Declare variables
    gpio_cfg_t gpio_pwm;    // to configure GPIO
    tmr_cfg_t tmr;          // to congigure timer
    tmr_pwm_cfg_t tmr_pwm;  // for configure PWM
    unsigned int period_ticks = PeripheralClock / FREQ;
    unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100;
    
    // Congfigure GPIO port and pin for PWM
    gpio_pwm.func = GPIO_FUNC_ALT4;
    gpio_pwm.port = PORT_PWM;
    gpio_pwm.mask = PIN_PWM; 
    gpio_pwm.pad = GPIO_PAD_PULL_DOWN;
    
    if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) {
        printf("Failed GPIO_Config for pwm.\n");
    }

    /*    
    Steps for configuring a timer for PWM mode:
    1. Disable the timer
    2. Set the prescale value
    3. Configure the timer for PWM mode
    4. Set polarity, pwm parameters
    5. Enable Timer
    */

    TMR_Disable(PWM_TIMER); 
    
    TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
    
    tmr.mode = TMR_MODE_PWM;
    tmr.cmp_cnt = period_ticks;
    tmr.pol = 0;
    TMR_Config(PWM_TIMER, &tmr);
    
    tmr_pwm.pol = 1;
    tmr_pwm.per_cnt = period_ticks;
    tmr_pwm.duty_cnt = duty_ticks;
    
    if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
        printf("Failed TMR_PWMConfig.\n");
    }
    
    TMR_Enable(PWM_TIMER);

    printf("PWM started.\n");
}


// *****************************************************************************
int main(void)
{
    int count = 0;

    printf("Hello World!\n");

#if 1
    //Setup the I2CM
    I2C_Shutdown(MXC_I2C0_BUS0);
    I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);

    I2C_Shutdown(MXC_I2C1_BUS0);
    I2C_Init(MXC_I2C1_BUS0, I2C_FAST_MODE, NULL);

    pmic_init();
    pmic_set_led(0, 0);
    pmic_set_led(1, 0);
    pmic_set_led(2, 0);
    TMR_Delay(MXC_TMR0, MSEC(1000), 0);
#endif

    // Enable SPI
    sys_cfg_spi_t spi17y_master_cfg;

    spi17y_master_cfg.map = MAP_A;
    spi17y_master_cfg.ss0 = Enable;
    spi17y_master_cfg.ss1 = Disable;
    spi17y_master_cfg.ss2 = Disable;

    if (SPI_Init(SPI, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
        printf("Error configuring SPI\n");
        while (1);
    }

    //GPIO_Config(&DEV_RST_PIN);
    GPIO_Config(&DEV_DC_PIN);

    PWM_Output();
    LCD_SetBacklight(500);
    LCD_Init();
    LCD_Clear(BLACK);

    Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE);

    Paint_Clear(BLACK);
    Paint_SetRotate(180);
    Paint_DrawString_EN(0, 0, "123", &Font24, 0x000f, 0xfff0);
    Paint_DrawString_EN(0, 23, "ABC", &Font24, BLUE, CYAN);
    Paint_DrawString_CN(20,42, "΢ѩµç×Ó",  &Font24CN, WHITE, RED);
    Paint_DrawRectangle(70, 10, 100, 40, RED,DRAW_FILL_EMPTY, DOT_PIXEL_2X2 );
    Paint_DrawLine(70, 10, 100, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
    Paint_DrawLine(100, 10, 70, 40, MAGENTA, LINE_STYLE_SOLID, DOT_PIXEL_2X2);
    Paint_DrawCircle(85,25, 22, GREEN, DRAW_FILL_EMPTY, DOT_PIXEL_2X2);

    Paint_DrawImage(gImage_40X40,120, 0,40, 40);
    DEV_Delay_ms(10000);
    Paint_DrawImage(gImage_160X80,0, 0, 160, 80);

    while (1) {
        TMR_Delay(MXC_TMR0, MSEC(1000), 0);
        printf("count = %d\n", count++);
    }
}