#include <stdio.h>
#include <string.h>
#define CAL_OBJVT_MAX_NUM 3
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef struct
{
int16_t cal_1_objt_s16;
int16_t cal_2_objt_s16;
int16_t cal_3_objt_s16;
int16_t cal_4_objt_s16;
int16_t cal_5_objt_s16;
int16_t cal_6_objt_s16;
int16_t cal_7_objt_s16;
int16_t cal_8_objt_s16;
int32_t cal_1_objv_s32;
int32_t cal_2_objv_s32;
int32_t cal_3_objv_s32;
int32_t cal_4_objv_s32;
int32_t cal_5_objv_s32;
int32_t cal_6_objv_s32;
int32_t cal_7_objv_s32;
int32_t cal_8_objv_s32;
} OBJVCOR;
OBJVCOR sys_obj_gs;
OBJVCOR sys_objvcor_gs;
OBJVCOR sysrwbuf_gu;
int16_t objvzerot_gs16;
int32_t objvzerov_gs32;
uint16_t sys_datatemp_gu16;
int32_t sys_datatemp_gs32;
int16_t data_getobjtemp(int16_t ambtemp_s16,int32_t objv_s32)
{
uint8_t i = 0;
uint8_t j = 0;
int16_t *ecalt_ps16 = (int16_t *)&sys_objvcor_gs.cal_1_objt_s16;
int32_t *ecalv_ps32 = (int32_t *)&sys_objvcor_gs.cal_1_objv_s32;
int32_t *icalv_ps32 = (int32_t *)&sysrwbuf_gu.cal_1_objv_s32;
memcpy(&sys_objvcor_gs,&sys_obj_gs,sizeof(OBJVCOR));
#if 1
for (i = 0; i < CAL_OBJVT_MAX_NUM; i++)
{
if (ambtemp_s16 < ecalt_ps16[i])
break;
}
if (i == 0)
{
icalv_ps32[0] = objvzerov_gs32 - (int32_t)(ecalv_ps32[1] - ecalv_ps32[0]) * (int32_t)(ambtemp_s16 - ecalt_ps16[0]) / (int32_t)(ecalt_ps16[1] - ecalt_ps16[0]);
for (i = 0; i < CAL_OBJVT_MAX_NUM-1; i++)
{
icalv_ps32[i + 1] = icalv_ps32[i] - (ecalv_ps32[i] - ecalv_ps32[i + 1]);
}
}
else if (i == CAL_OBJVT_MAX_NUM)
{
icalv_ps32[CAL_OBJVT_MAX_NUM-1] = objvzerov_gs32 - (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - ecalv_ps32[CAL_OBJVT_MAX_NUM-2]) * (int32_t)(ambtemp_s16 - ecalt_ps16[CAL_OBJVT_MAX_NUM-1]) / (int32_t)(ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - ecalt_ps16[CAL_OBJVT_MAX_NUM-2]);
for (i = CAL_OBJVT_MAX_NUM-1; i > 0; i--)
{
icalv_ps32[i - 1] = icalv_ps32[i] - (ecalv_ps32[i] - ecalv_ps32[i - 1]);
}
}
else
{
icalv_ps32[i] = objvzerov_gs32 - (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]) * (int32_t)(ambtemp_s16 - ecalt_ps16[i]) / (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]);
for (j = i; j > 0; j--)
{
icalv_ps32[j - 1] = icalv_ps32[j] - (ecalv_ps32[j] - ecalv_ps32[j - 1]);
}
for (j = i; j < CAL_OBJVT_MAX_NUM-1; j++)
{
icalv_ps32[j + 1] = icalv_ps32[j] - (ecalv_ps32[j] - ecalv_ps32[j + 1]);
}
}
memcpy(ecalv_ps32, icalv_ps32, 32);
for(i = 0;i < 8;i++)
{
printf("%d:%d\n",ecalt_ps16[i],ecalv_ps32[i]);
}
printf("\n");
for (i = 0; i < CAL_OBJVT_MAX_NUM; i++)
{
if (objv_s32 < ecalv_ps32[i])
break;
}
if (i == 0)
{
sys_datatemp_gs32 = (int32_t)ecalt_ps16[0] - (int32_t)(ecalt_ps16[0] - ecalt_ps16[1]) * (int32_t)(ecalv_ps32[0] - objv_s32) / (int32_t)(ecalv_ps32[0] - ecalv_ps32[1]);
}
else if (i == CAL_OBJVT_MAX_NUM)
{
sys_datatemp_gs32 = (int32_t)ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - (int32_t)(ecalt_ps16[CAL_OBJVT_MAX_NUM-1] - ecalt_ps16[CAL_OBJVT_MAX_NUM-2]) * (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - objv_s32) / (int32_t)(ecalv_ps32[CAL_OBJVT_MAX_NUM-1] - ecalv_ps32[CAL_OBJVT_MAX_NUM-2]);
}
else
{
sys_datatemp_gs32 = (int32_t)ecalt_ps16[i] - (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]) * (int32_t)(ecalv_ps32[i] - objv_s32) / (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]);
}
#else
for (i = 0; i < CAL_OBJVT_MAX_NUM; i++)
{
if (ambtemp_s16 < ecalt_ps16[i])
break;
}
if (i == 0)
{
i = 1;
}
else if (i == CAL_OBJVT_MAX_NUM)
{
i = CAL_OBJVT_MAX_NUM - 1;
}
sys_datatemp_gs32 = objvzerov_gs32 - (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]) * (int32_t)(ambtemp_s16 - objvzerot_gs16) / (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]);
sys_datatemp_gs32 = sys_datatemp_gs32 - objvzerov_gs32;
for(i = 0;i < CAL_OBJVT_MAX_NUM;i++)
{
icalv_ps32[i] = ecalv_ps32[i] + sys_datatemp_gs32;
}
memcpy(ecalv_ps32, icalv_ps32, 32);
for(i = 0;i < 8;i++)
{
printf("%d:%d\n",ecalt_ps16[i],ecalv_ps32[i]);
}
printf("\n");
for (i = 0; i < CAL_OBJVT_MAX_NUM; i++)
{
if (objv_s32 < ecalv_ps32[i])
break;
}
if (i == 0)
{
i = 1;
}
else if (i == CAL_OBJVT_MAX_NUM)
{
i = CAL_OBJVT_MAX_NUM - 1;
}
sys_datatemp_gs32 = (int32_t)ecalt_ps16[i] - (int32_t)(ecalt_ps16[i] - ecalt_ps16[i - 1]) * (int32_t)(ecalv_ps32[i] - objv_s32) / (int32_t)(ecalv_ps32[i] - ecalv_ps32[i - 1]);
#endif
return sys_datatemp_gs32;
}
int main(void)
{
int16_t *calt_ps16 = (int16_t *)&sys_obj_gs.cal_1_objt_s16;
int32_t *calv_ps32 = (int32_t *)&sys_obj_gs.cal_1_objv_s32;
uint8_t i;
int16_t temp;
#if 0
sys_obj_gs.cal_1_objt_s16 = 250;
sys_obj_gs.cal_1_objv_s32 = 0;
sys_obj_gs.cal_2_objt_s16 = 320;
sys_obj_gs.cal_2_objv_s32 = 620;
sys_obj_gs.cal_3_objt_s16 = 370;
sys_obj_gs.cal_3_objv_s32 = 1083;
sys_obj_gs.cal_4_objt_s16 = 370;
sys_obj_gs.cal_4_objv_s32 = 0;
sys_obj_gs.cal_5_objt_s16 = 370;
sys_obj_gs.cal_5_objv_s32 = 0;
sys_obj_gs.cal_6_objt_s16 = 370;
sys_obj_gs.cal_6_objv_s32 = 0;
sys_obj_gs.cal_7_objt_s16 = 370;
sys_obj_gs.cal_7_objv_s32 = 0;
sys_obj_gs.cal_8_objt_s16 = 370;
sys_obj_gs.cal_8_objv_s32 = 0;
#else
sys_obj_gs.cal_1_objt_s16 = 250;
sys_obj_gs.cal_1_objv_s32 = 174;
sys_obj_gs.cal_2_objt_s16 = 320;
sys_obj_gs.cal_2_objv_s32 = 803;
sys_obj_gs.cal_3_objt_s16 = 370;
sys_obj_gs.cal_3_objv_s32 = 1271;
sys_obj_gs.cal_4_objt_s16 = 370;
sys_obj_gs.cal_4_objv_s32 = 0;
sys_obj_gs.cal_5_objt_s16 = 370;
sys_obj_gs.cal_5_objv_s32 = 0;
sys_obj_gs.cal_6_objt_s16 = 370;
sys_obj_gs.cal_6_objv_s32 = 0;
sys_obj_gs.cal_7_objt_s16 = 370;
sys_obj_gs.cal_7_objv_s32 = 0;
sys_obj_gs.cal_8_objt_s16 = 370;
sys_obj_gs.cal_8_objv_s32 = 0;
#endif
objvzerot_gs16 = sys_obj_gs.cal_1_objt_s16;
objvzerov_gs32 = sys_obj_gs.cal_1_objv_s32;
temp = data_getobjtemp(370,-942);
printf("temp:%d\n\n",temp);
for (i = 0; i < CAL_OBJVT_MAX_NUM; i++)
{
calv_ps32[i] = calv_ps32[i] - objvzerov_gs32;
}
objvzerot_gs16 = sys_obj_gs.cal_1_objt_s16;
objvzerov_gs32 = sys_obj_gs.cal_1_objv_s32;
for(i = 0;i < 8;i++)
{
printf("*%d:%d\n",calt_ps16[i],calv_ps32[i]);
}
printf("\n");
temp = data_getobjtemp(370,-942);
printf("temp:%d\n\n",temp);
return 0;
}