/*
 * fml_adc.c
 *
 *  Created on: 2025骞�4鏈�7鏃�
 *      Author: 22332
 */
#include <stdio.h>
#include "cola_init.h"
#include "cola_os.h"
#include "cola_device.h"
#include "fml_adc.h"
static task_t gadcTask;
extern void logWrite(const char *fmt, ...);

static const cola_device_t *g_pDevadc = NULL;

uint16_t adc_temp_value[10];
uint16_t adc_batt_value[10];

uint16_t V_battery_ad = 0;
uint16_t adc_temp = 0;
float V_battery_ad_3V3;
uint16_t adc_filter(uint16_t *adc_values) {
    uint16_t sum = 0;
    uint16_t min, max;
    uint8_t i;

    // 1. 采集10次ADC值（这里需要替换为实际的ADC读取函数）

    // 2. 找出最大值和最小值
    min = max = adc_values[0];
    for (i = 1; i < 10; i++) {
        if (adc_values[i] < min) {
            min = adc_values[i];
        }
        if (adc_values[i] > max) {
            max = adc_values[i];
        }
    }

    // 3. 计算去掉最大最小值后的和
    uint8_t count = 0;
    for (i = 0; i < 10; i++) {
        if (adc_values[i] != min && adc_values[i] != max) {
            sum += adc_values[i];
            count++;
        }
    }

    // 处理所有值相同的情况（避免除以0）
    if (count == 0) {
        return adc_values[9]; // 如果所有值相同，直接返回平均值
    }

    // 4. 计算平均值并返回
    return sum / count;
    }


void fml_adc_read_polling(void *arg, uint32_t event)
{
	static uint8_t i,j;
	adc_batt_value[i++] = cola_device_read(g_pDevadc,2,0,0);
	adc_temp_value[j++] = cola_device_read(g_pDevadc,3,0,0);
	if((i==10) &&(j==10))
	{
		V_battery_ad = adc_filter(adc_batt_value);
		adc_temp = adc_filter(adc_temp_value);
		i = j = 0;
		logWrite("V_battery_ad = %d\r\n",V_battery_ad);
		logWrite("adc_temp = %d\r\n",fml_adc_read_once_temp());


	}

}

void fml_adc_init(void)
{
	g_pDevadc = cola_device_find("DEVICE_ADC");
    if(g_pDevadc)
    cola_device_open(g_pDevadc, 0);
    V_battery_ad = cola_device_read(g_pDevadc,2,0,0);
    adc_temp = cola_device_read(g_pDevadc,3,0,0);
    cola_timer_create(&gadcTask, fml_adc_read_polling, NULL);
    cola_timer_start(&gadcTask, EN_COLA_TIMER_ALWAYS, 100);
}

uint8_t fml_adc_read_once_temp(void)
{
	//V_temp_ad = cola_device_read(g_pDevadc,3,0,0);
	if(adc_temp<252)
			return 190;
	else if(adc_temp<257)
			return 189;
	else if(adc_temp<262)
			return 188;
	else if(adc_temp<267)
			return 187;
	else if(adc_temp<273)
			return 186;
	else if(adc_temp<278)
			return 185;
	else if(adc_temp<284)
			return 184;
	else if(adc_temp<289)
			return 183;
	else if(adc_temp<295)
			return 182;
	else if(adc_temp<301)
			return 181;
	else if(adc_temp<307)
			return 180;
	else if(adc_temp<313)
			return 179;
	else if(adc_temp<319)
			return 178;
	else if(adc_temp<326)
			return 177;
	else if(adc_temp<332)
			return 176;
	else if(adc_temp<339)
			return 175;
	else if(adc_temp<346)
			return 174;
	else if(adc_temp<353)
			return 173;
	else if(adc_temp<360)
			return 172;
	else if(adc_temp<368)
			return 171;
	else if(adc_temp<375)
			return 170;
	else if(adc_temp<383)
			return 169;
	else if(adc_temp<391)
			return 168;
	else if(adc_temp<399)
			return 167;
	else if(adc_temp<407)
			return 166;
	else if(adc_temp<416)
			return 165;
	else if(adc_temp<425)
			return 164;
	else if(adc_temp<433)
			return 163;
	else if(adc_temp<442)
			return 162;
	else if(adc_temp<452)
			return 161;
	else if(adc_temp<461)
			return 160;
	else if(adc_temp<471)
			return 159;
	else if(adc_temp<481)
			return 158;
	else if(adc_temp<491)
			return 157;
	else if(adc_temp<501)
			return 156;
	else if(adc_temp<512)
			return 155;
	else if(adc_temp<523)
			return 154;
	else if(adc_temp<534)
			return 153;
	else if(adc_temp<545)
			return 152;
	else if(adc_temp<557)
			return 151;
	else if(adc_temp<569)
			return 150;
	else if(adc_temp<581)
			return 149;
	else if(adc_temp<593)
			return 148;
	else if(adc_temp<606)
			return 147;
	else if(adc_temp<619)
			return 146;
	else if(adc_temp<632)
			return 145;
	else if(adc_temp<646)
			return 144;
	else if(adc_temp<660)
			return 143;
	else if(adc_temp<674)
			return 142;
	else if(adc_temp<688)
			return 141;
	else if(adc_temp<703)
			return 140;
	else if(adc_temp<718)
			return 139;
	else if(adc_temp<734)
			return 138;
	else if(adc_temp<750)
			return 137;
	else if(adc_temp<766)
			return 136;
	else if(adc_temp<782)
			return 135;
	else if(adc_temp<799)
			return 134;
	else if(adc_temp<816)
			return 133;
	else if(adc_temp<834)
			return 132;
	else if(adc_temp<852)
			return 131;
	else if(adc_temp<870)
			return 130;
	else if(adc_temp<889)
			return 129;
	else if(adc_temp<908)
			return 128;
	else if(adc_temp<927)
			return 127;
	else if(adc_temp<947)
			return 126;
	else if(adc_temp<967)
			return 125;
	else if(adc_temp<987)
			return 124;
	else if(adc_temp<1008)
			return 123;
	else if(adc_temp<1029)
			return 122;
	else if(adc_temp<1051)
			return 121;
	else if(adc_temp<1073)
			return 120;
	else if(adc_temp<1096)
			return 119;
	else if(adc_temp<1119)
			return 118;
	else if(adc_temp<1142)
			return 117;
	else if(adc_temp<1166)
			return 116;
	else if(adc_temp<1190)
			return 115;
	else if(adc_temp<1215)
			return 114;
	else if(adc_temp<1240)
			return 113;
	else if(adc_temp<1265)
			return 112;
	else if(adc_temp<1291)
			return 111;
	else if(adc_temp<1317)
			return 110;
	else if(adc_temp<1344)
			return 109;
	else if(adc_temp<1371)
			return 108;
	else if(adc_temp<1398)
			return 107;
	else if(adc_temp<1426)
			return 106;
	else if(adc_temp<1454)
			return 105;
	else if(adc_temp<1482)
			return 104;
	else if(adc_temp<1511)
			return 103;
	else if(adc_temp<1541)
			return 102;
	else if(adc_temp<1570)
			return 101;
	else if(adc_temp<1600)
			return 100;
	else if(adc_temp<1631)
			return 99;
	else if(adc_temp<1663)
			return 98;
	else if(adc_temp<1694)
			return 97;
	else if(adc_temp<1726)
			return 96;
	else if(adc_temp<1758)
			return 95;
	else if(adc_temp<1791)
			return 94;
	else if(adc_temp<1824)
			return 93;
	else if(adc_temp<1857)
			return 92;
	else if(adc_temp<1890)
			return 91;
	else if(adc_temp<1923)
			return 90;
	else if(adc_temp<1957)
			return 89;
	else if(adc_temp<1991)
			return 88;
	else if(adc_temp<2025)
			return 87;
	else if(adc_temp<2060)
			return 86;
	else if(adc_temp<2094)
			return 85;
	else if(adc_temp<2129)
			return 84;
	else if(adc_temp<2164)
			return 83;
	else if(adc_temp<2198)
			return 82;
	else if(adc_temp<2233)
			return 81;
	else if(adc_temp<2268)
			return 80;
	else if(adc_temp<2303)
			return 79;
	else if(adc_temp<2338)
			return 78;
	else if(adc_temp<2373)
			return 77;
	else if(adc_temp<2408)
			return 76;
	else if(adc_temp<2443)
			return 75;
	else if(adc_temp<2478)
			return 74;
	else if(adc_temp<2513)
			return 73;
	else if(adc_temp<2548)
			return 72;
	else if(adc_temp<2582)
			return 71;
	else if(adc_temp<2617)
			return 70;
	else if(adc_temp<2651)
			return 69;
	else if(adc_temp<2685)
			return 68;
	else if(adc_temp<2719)
			return 67;
	else if(adc_temp<2753)
			return 66;
	else if(adc_temp<2786)
			return 65;
	else if(adc_temp<2820)
			return 64;
	else if(adc_temp<2852)
			return 63;
	else if(adc_temp<2885)
			return 62;
	else if(adc_temp<2917)
			return 61;
	else if(adc_temp<2949)
			return 60;
	else if(adc_temp<2980)
			return 59;
	else if(adc_temp<3011)
			return 58;
	else if(adc_temp<3042)
			return 57;
	else if(adc_temp<3072)
			return 56;
	else if(adc_temp<3102)
			return 55;
	else if(adc_temp<3132)
			return 54;
	else if(adc_temp<3161)
			return 53;
	else if(adc_temp<3189)
			return 52;
	else if(adc_temp<3218)
			return 51;
	else if(adc_temp<3245)
			return 50;
	else if(adc_temp<3272)
			return 49;
	else if(adc_temp<3299)
			return 48;
	else if(adc_temp<3325)
			return 47;
	else if(adc_temp<3350)
			return 46;
	else if(adc_temp<3376)
			return 45;
	else if(adc_temp<3400)
			return 44;
	else if(adc_temp<3424)
			return 43;
	else if(adc_temp<3448)
			return 42;
	else if(adc_temp<3470)
			return 41;
	else if(adc_temp<3493)
			return 40;
	else if(adc_temp<3515)
			return 39;
	else if(adc_temp<3536)
			return 38;
	else if(adc_temp<3557)
			return 37;
	else if(adc_temp<3597)
			return 36;
	else if(adc_temp<3616)
			return 35;
	else if(adc_temp<3635)
			return 34;
	else if(adc_temp<3653)
			return 33;
	else if(adc_temp<3671)
			return 32;
	else if(adc_temp<3688)
			return 31;
	else if(adc_temp<3705)
			return 30;
	else if(adc_temp<3721)
			return 29;
	else if(adc_temp<3736)
			return 28;
	else if(adc_temp<3751)
			return 27;
	else if(adc_temp<3766)
			return 26;
	else if(adc_temp<3780)
			return 25;
	else if(adc_temp<3794)
			return 24;
	else if(adc_temp<3807)
			return 23;
	else if(adc_temp<3820)
			return 22;
	else if(adc_temp<3832)
			return 21;
	else if(adc_temp<3844)
			return 20;
	else if(adc_temp<3855)
			return 19;
	else if(adc_temp<3866)
			return 18;
	else if(adc_temp<3877)
			return 17;
	else if(adc_temp<3887)
			return 16;
	else if(adc_temp<3897)
			return 15;
	else if(adc_temp<3907)
			return 14;
	else if(adc_temp<3916)
			return 13;
	else if(adc_temp<3925)
			return 12;
	else if(adc_temp<3933)
			return 11;
	else if(adc_temp<3941)
			return 10;
	else if(adc_temp<3949)
			return 9;
	else if(adc_temp<3956)
			return 8;
	else if(adc_temp<3963)
			return 7;
	else if(adc_temp<3970)
			return 6;
	else if(adc_temp<3977)
			return 5;
	else if(adc_temp<3983)
			return 4;
	else if(adc_temp<3989)
			return 3;
	else if(adc_temp<3994)
			return 2;
	else if(adc_temp<4000)
			return 1;
	else
		return 0;
}
