#include "sub_functions.h"
#include "dy_utils/dy_common.h"
#include <stdio.h>
#include <stdlib.h>

#define ADDR_AUTOINCREMENT  0x40
#define ADDR_STATIONARY     0x44

void clean_screen(tm1640_gpio *gpio_handler)
{
    unsigned char clean_screen[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    tm1640_gpio_command(gpio_handler, ADDR_AUTOINCREMENT);
    tm1640_gpio_data(gpio_handler, clean_screen, sizeof(clean_screen));
}

void turn_exclamatory_on(tm1640_gpio *gpio_handler)
{
    turn_led_on(gpio_handler, LED_GPID16, EXCLAMATORY_MART_ON);
}

void turn_exclamatory_off(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID16, EXCLAMATORY_MART_OFF);
}

void clear_alarm(tm1640_gpio *gpio_handler)
{
    turn_exclamatory_off(gpio_handler);
    clean_warning_level(gpio_handler);
}

void turn_percent_on(tm1640_gpio *gpio_handler)
{
    turn_led_on(gpio_handler, LED_GPID3, PERCENT_ON);
    turn_led_on(gpio_handler, LED_GPID4, PERCENT_ON);
}

void turn_percent_off(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID3, PERCENT_OFF);
    turn_led_off(gpio_handler, LED_GPID4, PERCENT_OFF);
}

void turn_wifi_on(tm1640_gpio *gpio_handler)
{
    turn_led_on(gpio_handler, LED_GPID6, WIFI_G6_ON);
    turn_led_on(gpio_handler, LED_GPID7, WIFI_G7_ON);
}

void turn_wifi_off(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID6, WIFI_G6_OFF);
    turn_led_off(gpio_handler, LED_GPID7, WIFI_G7_OFF);
}

void turn_sun_on(tm1640_gpio *gpio_handler)
{
    turn_led_on(gpio_handler, LED_GPID7,  SUN_ON);
}

void turn_sun_off(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID7,  SUN_OFF);
}

void change_state_to_standby(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID5, CHARGING_OFF);
    turn_led_off(gpio_handler, LED_GPID6, DISCHARGING_OFF);
    turn_led_on(gpio_handler, LED_GPID5,  STANDBY_ON);
}

void change_state_to_charging(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID5, STANDBY_OFF);
    turn_led_off(gpio_handler, LED_GPID6, DISCHARGING_OFF);
    turn_led_on(gpio_handler, LED_GPID5,  CHARGING_ON);
}

void change_state_to_discharging(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID5, STANDBY_OFF);
    turn_led_off(gpio_handler, LED_GPID5, CHARGING_OFF);
    turn_led_on(gpio_handler, LED_GPID6,  DISCHARGING_ON);
}

void clean_soc_circle(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_OFF);
    turn_led_off(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_OFF);
    turn_led_off(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_OFF);
    turn_led_off(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_OFF);
    turn_led_off(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_OFF);
    turn_led_off(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_OFF);
    turn_led_off(gpio_handler, BLUE_70_GROUP_ID, BLUE_70_OFF);
    turn_led_off(gpio_handler, BLUE_80_GROUP_ID, BLUE_80_OFF);
    turn_led_off(gpio_handler, BLUE_90_GROUP_ID, BLUE_90_OFF);
    turn_led_off(gpio_handler, BLUE_100_GROUP_ID, BLUE_100_OFF);
}

void set_soc_circle(tm1640_gpio *gpio_handler, int soc_val)
{
    static int led_num_last = 0;
    int led_num = soc_val / 10;

    printf("led_num: %d\n", led_num);

    if (led_num_last == led_num)
        return;

    led_num_last = led_num;

    clean_soc_circle(gpio_handler);

    switch (led_num)
    {
        case 10:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            turn_led_on(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_ON);
            turn_led_on(gpio_handler, BLUE_70_GROUP_ID, BLUE_70_ON);
            turn_led_on(gpio_handler, BLUE_80_GROUP_ID, BLUE_80_ON);
            turn_led_on(gpio_handler, BLUE_90_GROUP_ID, BLUE_90_ON);
            turn_led_on(gpio_handler, BLUE_100_GROUP_ID, BLUE_100_ON);
            break;
        case 9:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            turn_led_on(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_ON);
            turn_led_on(gpio_handler, BLUE_70_GROUP_ID, BLUE_70_ON);
            turn_led_on(gpio_handler, BLUE_80_GROUP_ID, BLUE_80_ON);
            turn_led_on(gpio_handler, BLUE_90_GROUP_ID, BLUE_90_ON);
            break;
        case 8:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            turn_led_on(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_ON);
            turn_led_on(gpio_handler, BLUE_70_GROUP_ID, BLUE_70_ON);
            turn_led_on(gpio_handler, BLUE_80_GROUP_ID, BLUE_80_ON);
            break;
        case 7:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            turn_led_on(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_ON);
            turn_led_on(gpio_handler, BLUE_70_GROUP_ID, BLUE_70_ON);
            break;
        case 6:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            turn_led_on(gpio_handler, BLUE_60_GROUP_ID, BLUE_60_ON);
            break;
        case 5:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            turn_led_on(gpio_handler, BLUE_50_GROUP_ID, BLUE_50_ON);
            break;
        case 4:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            turn_led_on(gpio_handler, BLUE_40_GROUP_ID, BLUE_40_ON);
            break;
        case 3:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            turn_led_on(gpio_handler, BLUE_30_GROUP_ID, BLUE_30_ON);
            break;
        case 2:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            turn_led_on(gpio_handler, BLUE_20_GROUP_ID, BLUE_20_ON);
            break;
        case 1:
            turn_led_on(gpio_handler, BLUE_10_GROUP_ID, BLUE_10_ON);
            break;
        case 0:
            clean_soc_circle(gpio_handler);
            break;
        default:
            clean_soc_circle(gpio_handler);
    }
}

void set_soc_value(tm1640_gpio *gpio_handler, int soc)
{
    if (soc >= 100)
    {
        turn_led_on(gpio_handler, LED_GPID6, HUNDRED_UP_ON);
        turn_led_on(gpio_handler, LED_GPID1, HUNDRED_DOWN_ON);
        turn_led_on(gpio_handler, LED_GPID2, HUNDRED_DOWN_ON);
        set_digital_tube(gpio_handler, SOC_TEN_DIGIT_1, 0);
        set_digital_tube(gpio_handler, SOC_TEN_DIGIT_2, 0);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_1, 0);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_2, 0);
    }
    else if (soc < 10)
    {
        turn_led_off(gpio_handler, LED_GPID6, HUNDRED_UP_OFF);
        turn_led_off(gpio_handler, LED_GPID1, HUNDRED_DOWN_OFF);
        turn_led_off(gpio_handler, LED_GPID2, HUNDRED_DOWN_OFF);
        clean_digital_tube(gpio_handler, SOC_TEN_DIGIT_1);
        clean_digital_tube(gpio_handler, SOC_TEN_DIGIT_2);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_1, soc);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_2, soc);
    }
    else
    {
        int tens_place = soc / 10;
        int ones_place = soc % 10;
        turn_led_off(gpio_handler, LED_GPID6, HUNDRED_UP_OFF);
        turn_led_off(gpio_handler, LED_GPID1, HUNDRED_DOWN_OFF);
        turn_led_off(gpio_handler, LED_GPID2, HUNDRED_DOWN_OFF);
        set_digital_tube(gpio_handler, SOC_TEN_DIGIT_1, tens_place);
        set_digital_tube(gpio_handler, SOC_TEN_DIGIT_2, tens_place);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_1, ones_place);
        set_digital_tube(gpio_handler, SOC_UNIT_DIGIT_2, ones_place);
    }
}

void set_warning_level(tm1640_gpio *gpio_handler, int level_val)
{
    turn_exclamatory_on(gpio_handler);
    set_digital_tube(gpio_handler, LED_GPID15, level_val);
}

void clean_warning_level(tm1640_gpio *gpio_handler)
{
    clean_digital_tube(gpio_handler, LED_GPID15);
}

void turn_outside_circle_on(tm1640_gpio *gpio_handler)
{
    turn_led_on(gpio_handler, LED_GPID7,  G7_H7_ON);
    turn_led_on(gpio_handler, LED_GPID8,  G8_ON);
    turn_led_on(gpio_handler, LED_GPID9,  G9_ON);
    turn_led_on(gpio_handler, LED_GPID10, G10_ON);
    turn_led_on(gpio_handler, LED_GPID11, G11_ON);
}

void turn_outside_circle_off(tm1640_gpio *gpio_handler)
{
    turn_led_off(gpio_handler, LED_GPID7,  G7_H7_OFF);
    turn_led_off(gpio_handler, LED_GPID8,  G8_OFF);
    turn_led_off(gpio_handler, LED_GPID9,  G9_OFF);
    turn_led_off(gpio_handler, LED_GPID10, G10_OFF);
    turn_led_off(gpio_handler, LED_GPID11, G11_OFF);
}