#include "master_slave_recv_api.h" #include "uart.h" #include "string.h" #include "mbcrc.h" #include "administrator.h" #include "sundry.h" #include "billing.h" #include "check_out.h" INTER_RECV_PARA_T __attribute__ ((aligned (4))) inter_recv_para_g = {.inter_recv_flag = RESET}; // SLAVE_FLOW_DATA_T slave_flow_data_g = {0}; double temp_data_g = 0.0f,cal_display_exit_data_g = 0.0f; /*¶Á´Ó»úÃüÁîµÄ·µ»Ø±í*/ static const SLAVE_RECV_TABLE_DRIVE_T read_recv_tab_func[] = { {SC_RO_RESULT, Slave_FlowDataRecv}, {SC_RO_CAL_RESULT, Slave_CalFlowData_Recv}, {SC_RO_TP, Slave_TempPressRecv}, {SC_RO_ALARM, Slave_AlarmBytesRecv}, {SC_RW_HARDWARE, Slave_HardwareRecv}, {PIPE_RW_PARA, Slave_PipeParaRecv}, {UT_RW_PARA, Slave_UtParaRecv}, {CORR_RW_SET, Slave_CorrSetReal_Recv}, {CORR_RO_REAL, Slave_CorrSetReal_Recv}, {RAW_RO_DATA, Slave_RawDataRecv}, {DATA_RO_REAL_TIME, Slave_MeasureRealTimeData_Recv}, {SC_RO_STATUS, Slave_StateBytesRecv}, {UT_RO_REAL_PARA_1,Slave_UtRealPara_1_Recv}, {UT_RW_REAL_PARA_2,Slave_UtRealPara_2_Recv}, {SC_RES_PARA,Slave_ResPara_Recv}, {DATA_RO_TEMP_TIME_DIFF,Slave_Temp_TimeDiff_Recv}, {CAL_DATA_PARA,Slave_CalData_Recv}, {CORR_RW_FIXED,Slave_CorrFixed_Recv}, }; /*½»»¥½ÓÊÕÖØÐ¼ÓÔØ*/ void Measure_DMA_CH1_Reload(void) { inter_recv_para_g.inter_recv_flag = RESET; //½ÓÊÕRAMµØÖ·ÖØÔØ DMA_ISR_DMACHFT_Clr(DMA_CH1); DMA_CHxCR_ChxEN_Setable(DMA_CH1, DISABLE); //ͨµÀʧÄÜ DMA_CHxMAR_Write(DMA_CH1, (uint32)inter_recv_para_g.inter_recv_union.inter_recv_buf); DMA_CHxCR_ChxEN_Setable(DMA_CH1, ENABLE); //ͨµÀʹÄÜ } /*½»»¥½ÓÊպ˲é*/ ErrorStatus_STM32 Measure_Uart3_Rx_DMA_CH1_Check(uint8_t timeout_max) { uint8_t timeout_cnt = 0; uint16_t dma_recv_cnt; uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH1); if(dma_mar_reg_read != (uint32)inter_recv_para_g.inter_recv_union.inter_recv_buf) { delay_ms(1); while(dma_mar_reg_read != DMA_CHxMAR_Read(DMA_CH1)) { dma_mar_reg_read = DMA_CHxMAR_Read(DMA_CH1); delay_ms(1); if(timeout_cnt++ > timeout_max) break; } } else return ERROR_1; dma_recv_cnt = dma_mar_reg_read - (uint32)inter_recv_para_g.inter_recv_union.inter_recv_buf; if(dma_recv_cnt) { inter_recv_para_g.inter_recv_length = dma_recv_cnt; inter_recv_para_g.inter_recv_flag = SET;//½ÓÊÕÍê³É return SUCCESS_0; } return ERROR_1; } /*´Ó»ú½á¹û´¦Àí*/ INTER_STATUS Slave_Result_Handler(INTER_RW_STATUS data_state, INTER_RECV_PARA_T *inter_recv_para_p) { INTER_STATUS status_code = INTER_UNKNOWN; uint16_t ex_crc_len = 0; uint16_t recv_crc_check = 0; if (inter_recv_para_p->inter_recv_flag) { inter_recv_para_p->inter_recv_flag = RESET; ex_crc_len = inter_recv_para_p->inter_recv_length - 2; recv_crc_check = inter_recv_para_p->inter_recv_union.inter_recv_buf[ex_crc_len + 1] << 8 | inter_recv_para_p->inter_recv_union.inter_recv_buf[ex_crc_len]; // ½ÓÊÕÊý¾ÝcrcÑéÖ¤£¨ÑéÖ¤Êý¾ÝÊÇ·ñÍêÕû£© if (recv_crc_check == usMBCRC16(0xFFFF,inter_recv_para_p->inter_recv_union.inter_recv_buf, ex_crc_len)) { if (inter_recv_para_p->inter_recv_union.inter_recv_buf[0] == SC_DATA_RD && data_state == INTER_DATA_READ) // ¶ÁÃüÁî½ÓÊÕ { // ÅжϱíÇý¶¯ for (uint8_t i = 0; i < RECV_TABLE_NUM; i++) { if ((read_recv_tab_func[i].data_table == inter_recv_para_p->inter_recv_union.inter_recv_buf[1]) && (read_recv_tab_func[i].RecvFuncHandler != NULL)) { status_code = read_recv_tab_func[i].RecvFuncHandler(&inter_recv_para_p->inter_recv_union.inter_recv_buf[2], inter_recv_para_p->inter_recv_length - 4); break; } } } else if (inter_recv_para_p->inter_recv_union.inter_recv_buf[0] == SC_DATA_WR && data_state == INTER_DATA_WRITE) // дÃüÁî½ÓÊÕ status_code = (INTER_STATUS)inter_recv_para_p->inter_recv_union.inter_recv_buf[1]; else // ·µ»ØÒì³£Ö¡»òÕßдÃüÁîµÄ·µ»ØÖ¡ status_code = (INTER_STATUS)inter_recv_para_p->inter_recv_union.inter_recv_buf[1]; } else { status_code = MASTER_RECVDATA_CRC_ERR; } } else status_code = MASTER_TIMEOUT; // ³¬Ê± // Flow_SysͨѶ // printf("inter_state = %d,ex_crc_len = %d,recv_crc_chcek = 0x%04X\r\n",status_code,ex_crc_len,recv_crc_check); // printf("receive_data = "); // for (uint8_t i = 0; i < inter_recv_para_p->inter_recv_length; i++) // printf("%02X ", inter_recv_para_p->inter_recv_union.inter_recv_buf[i]); // printf("\r\n"); memset(inter_recv_para_p->inter_recv_union.inter_recv_buf, 0, inter_recv_para_p->inter_recv_length); return status_code; } /*´Ó»úÎÂѹ½ÓÊÕ´¦Àí*/ INTER_STATUS Slave_TempPressRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SIZEOF_OF(struct measure_para, temperature) * 2 > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&sys_realtime_data_g.measure_para_s.temperature, pData, 4); memcpy(&sys_realtime_data_g.measure_para_s.pressure, &pData[4], 4); slave_para_union_g.temp_press_s.temp = sys_realtime_data_g.measure_para_s.temperature; slave_para_union_g.temp_press_s.press = sys_realtime_data_g.measure_para_s.pressure; return status_code; } /*´Ó»úÓ²¼þÐÅÏ¢½ÓÊÕ´¦Àí*/ INTER_STATUS Slave_HardwareRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_SOFT_HARD_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.slave_soft_hard_s, pData, SLAVE_SOFT_HARD_PARA_LENGTH); return status_code; } INTER_STATUS Slave_PipeParaRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_PIPE_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.pipe_para_s, pData, SLAVE_PIPE_PARA_LENGTH); return status_code; } INTER_STATUS Slave_UtParaRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_UT_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.ut_para_s, pData, SLAVE_UT_PARA_LENGTH); return status_code; } INTER_STATUS Slave_CorrSetReal_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_CORR_SET_REAL_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.corr_set_real_s, pData, SLAVE_CORR_SET_REAL_PARA_LENGTH); return status_code; } INTER_STATUS Slave_RawDataRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; // if(SLAVE_RAW_DATA_LENGTH > data_len) //½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È // status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.raw_data_s, pData, data_len); return status_code; } INTER_STATUS Slave_MeasureRealTimeData_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_REAL_TIME_DATA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.real_time_data_s, pData, SLAVE_REAL_TIME_DATA_LENGTH); return status_code; } INTER_STATUS Slave_StateBytesRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SYS_STATUS_BYTES_TYPE_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; // memcpy(&sys_admin_g.admin_union[4], pData, 2); memcpy(slave_para_union_g.raw_data_s.ut_ad_a,pData,2); return status_code; } INTER_STATUS Slave_AlarmBytesRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SYS_ALARM_BYTES_TYPE_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; // memcpy(&sys_admin_g.admin_union[10], pData, 2); memcpy(slave_para_union_g.raw_data_s.ut_ad_a,pData,2); return status_code; } INTER_STATUS Slave_UtRealPara_1_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_UT_REAL_PARA_1_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.ut_real_para_1_s, pData, SLAVE_UT_REAL_PARA_1_LENGTH); return status_code; } INTER_STATUS Slave_UtRealPara_2_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_UT_REAL_PARA_2_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.ut_real_para_2_s, pData, SLAVE_UT_REAL_PARA_2_LENGTH); return status_code; } INTER_STATUS Slave_ResPara_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_RES_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.res_para_s,pData,SLAVE_RES_PARA_LENGTH); return status_code; } INTER_STATUS Slave_Temp_TimeDiff_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_TEMP_TIMEDIFF_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g.temp_timediff_para_s,pData,SLAVE_TEMP_TIMEDIFF_PARA_LENGTH); return status_code; } INTER_STATUS Slave_CalData_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (2 > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g,pData,2); return status_code; } INTER_STATUS Slave_CorrFixed_Recv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; if (SLAVE_CORR_FIXED_PARA_LENGTH > data_len) // ½ÓÊÕ³¤¶ÈСÓڹ̶¨³¤¶È status_code = MASTER_DATA_LOSE_ERR; memcpy(&slave_para_union_g,pData,SLAVE_CORR_FIXED_PARA_LENGTH); return status_code; } /*¼ì¶¨Ä£Ê½Ï´ӻúÁ÷Á¿Êý¾Ý½ÓÊÕ´¦Àí*/ INTER_STATUS Slave_CalFlowData_Recv(uint8_t *pData, uint16_t data_len) { struct measure_para *sys_realtime_data_p = &sys_realtime_data_g.measure_para_s; //temp_data_gΪ0.25ÃëµÄ˲ʱÁ¿£¬flow_data * 4 Ϊ1ÃëµÄ˲ʱÁ¿£¬ËùÒÔ¾­¹ý¡°¶þ´ÎÐÞÕý¡±ÐèÒª * 4 ÐÞÕý ÔÙ / 4 Êä³ö if(inter_recv_para_g.inter_recv_union.slave_cal_data_s.flow_data >= 0) temp_data_g = (Slave_RawFlowDataSecondHandler(inter_recv_para_g.inter_recv_union.slave_cal_data_s.flow_data * 4, &sec_order_corr_real_g) / 4); else temp_data_g = 0; sys_realtime_data_p->cal_cumulate_reserve[1] += temp_data_g; return INTER_OK; } /*´Ó»úÁ÷Á¿Êý¾Ý½ÓÊÕ´¦Àí*/ INTER_STATUS Slave_FlowDataRecv(uint8_t *pData, uint16_t data_len) { INTER_STATUS status_code = INTER_OK; float __attribute__ ((aligned (4))) flow_temp_f[20] = {0}; //û°ì·¨ÇúÏ߾ȹú // struct slave_flow_data *slave_flow_data_p = &inter_recv_para_g.inter_recv_union.slave_flow_data_s; struct slave_flow_data *slave_flow_data_p = (struct slave_flow_data *)(pData - 2); struct measure_para *sys_realtime_data_p = &sys_realtime_data_g.measure_para_s; struct state_para *sys_realtime_state_p = &sys_realtime_data_g.state_para_s; /*¸ù¾Ý¼ÆÁ¿°å״̬×Ö1_2×öÏàÓ¦´¦Àí£¬¾ßÌåÄÚÈÝÏê¼û¡¶XXXX¡·*/ // memcpy(&sys_admin_g.admin_union[4], &slave_flow_data_p->status_byte, 2); // memcpy(&sys_admin_g.admin_union[10], &slave_flow_data_p->alarm_byte, 2); Slave_Status_AlarmBytesHandler(slave_flow_data_p->status_alarmbytes); /*Á÷Á¿´¦Àí*/ sys_realtime_data_p->temperature = slave_flow_data_p->temperature; // ԭʼζÈÖµ sys_realtime_data_p->pressure = slave_flow_data_p->pressure; // ԭʼѹÁ¦Öµ /*²ÎÊý´¦Àí*/ sys_realtime_state_p->tof_up = slave_flow_data_p->tof_up; sys_realtime_state_p->tof_down = slave_flow_data_p->tof_down; sys_realtime_state_p->tof_diff = slave_flow_data_p->tof_diff; sys_realtime_state_p->signal_intensity_up = slave_flow_data_p->signal_intensity_up; sys_realtime_state_p->signal_intensity_down = slave_flow_data_p->signal_intensity_down; sys_realtime_state_p->signal_gain_up = slave_flow_data_p->signal_gain_up; sys_realtime_state_p->signal_gain_down = slave_flow_data_p->signal_gain_down; sys_realtime_state_p->snr_up = slave_flow_data_p->snr_up; sys_realtime_state_p->snr_down = slave_flow_data_p->snr_down; sys_realtime_state_p->real_line_a = slave_flow_data_p->real_line_a; sys_realtime_state_p->real_line_b = slave_flow_data_p->real_line_b; sys_realtime_state_p->sound_vel = slave_flow_data_p->sound_vel; sys_realtime_state_p->flow_vel = slave_flow_data_p->flow_vel; /*ÓÉÓÚnum_wc»á³¬¹ý×î´óÏÞÖÆµÄ20£¬ËùÒÔÔÝʱ×ö³öÏÞÖÆ*/ if(slave_flow_data_p->num_wc > 20) slave_flow_data_p->num_wc = 20; for (uint8_t i = 0; i < slave_flow_data_p->num_wc; i++) { if(__SYS_FUNC_CFG_BYTES_GET(small_flow_excision) == RESET) //û¿ªÐ¡Á÷Á¿Çгý {} else { /*¶þ¼¶ÐÞÕý*/ slave_flow_data_p->instant_wc[i] = Slave_RawFlowDataSecondHandler(slave_flow_data_p->instant_wc[i],&sec_order_corr_real_g); if ((slave_flow_data_p->instant_wc[i] * 3600) >= sys_flow_alarm_cfg_g.small_flow_excision_value) // ˲ʱÁ÷Á¿Òª´óÓÚ×îСÁ÷Á¿£¨Ð¡Á÷Á¿Çгý£© {} else if (slave_flow_data_p->instant_wc[i] > 0.0f) // 0 < flow < ×îСÁ÷Á¿ slave_flow_data_p->instant_wc[i] = 0; // ½o0ÊÇΪÁË·½±ãºóÃæËãÆ½¾ùÖµ } } /*°Ñ˲ʱ¹¤¿öÌí¼Óµ½»·ÐζÓÁÐÖÐ*/ for(uint8_t i = 0;i < slave_flow_data_p->num_wc;i++) flow_temp_f[i] = slave_flow_data_p->instant_wc[i]; ring_write_array(&instant_wc_ring, &flow_temp_f[0], slave_flow_data_p->num_wc/*GET_FLOW_DATA_PERIOD_TIME*/, INSTANT_WC_RING_BUFFER_SIZE); return status_code; } /*Ïê¼ûÖ÷´ÓͨѶÕý³£Êý¾Ý±í״̬/±¨¾¯×ÖÄÚÈÝ*/ void Slave_Status_AlarmBytesHandler(SLAVE_STATUS_ALARMBYTES_UNION_T state_alarmbytes) { static uint8_t media_normal_flag = 0; static uint8_t dismantle_flag = 0; /*ÅжϽéÖÊ*/ if(state_alarmbytes.slave_status_alarmbytes_s.slave_media_status == 1) __SYS_STATUS_BYTES_STATUS(media_status, GAS, AV_NORMAL); else __SYS_STATUS_BYTES_STATUS(media_status, AIR, AV_NORMAL); if(state_alarmbytes.slave_status_alarmbytes_s.slave_press_err) __SYS_STATUS_ALARM_BYTES_SET(press_err); else __SYS_STATUS_BYTES_STATUS(press_err, RESET, AV_PRESS_ERR); if(state_alarmbytes.slave_status_alarmbytes_s.slave_temp_err) __SYS_STATUS_ALARM_BYTES_SET(temp_err); else __SYS_STATUS_BYTES_STATUS(temp_err, RESET, AV_TEMP_ERR); if(state_alarmbytes.slave_status_alarmbytes_s.slave_input_water) { __SYS_STATUS_ALARM_BYTES_SET(input_water); // __SYS_STATUS_BYTES_STATUS(media_status, WATER, AV_NORMAL); } else __SYS_STATUS_BYTES_STATUS(input_water, RESET, AV_INPUT_WATER_ERR); if(state_alarmbytes.slave_status_alarmbytes_s.slave_media_other) { if(media_normal_flag == 0) { media_normal_flag = 1; __SYS_ALARM_BYTES_SET(media_other,SET); } __SYS_STATUS_BYTES_STATUS(media_status, MEDIA_UNKNOWN, AV_NORMAL); }else if(media_normal_flag && (__SYS_STATUS_BYTES_GET(media_status) == GAS || __SYS_STATUS_BYTES_GET(media_status) == AIR)) { media_normal_flag = 0; Alarm_List_Node_Deleted(&pList_head,AV_MEDIA_ERR); } if(state_alarmbytes.slave_status_alarmbytes_s.slave_dismantle) { if(dismantle_flag == 0) { dismantle_flag = 1; __SYS_ALARM_BYTES_SET(dismantle,SET); } }else if(dismantle_flag && __SYS_STATUS_BYTES_GET(media_status) == GAS) { dismantle_flag = 0; Alarm_List_Node_Deleted(&pList_head,AV_DISMANTLE); } if(state_alarmbytes.slave_status_alarmbytes_s.slave_measure_err) __SYS_STATUS_ALARM_BYTES_SET(measure_err); else __SYS_STATUS_BYTES_STATUS(measure_err, RESET, AV_MEASURE_ERR); } /*ԭʼÊý¾Ý¶þ´ÎÐÞÕý´¦Àí*/ float Slave_RawFlowDataSecondHandler(float Q2,SECOND_ORDER_CORR_T * real_corr_data_p) { float Q3 = Q2 *= 3600,k = 1.0f; //¶þ´ÎÐÞÕýµÄÊýÖµµ¥Î»ÒªÎª ¡°M^3 / h¡± //ÐÞÕýÁ÷Á¿Öµ£¬ Q2Ϊһ¼¶ÐÞÕýÖ®ºóµÄ¹¤¿ö˲ʱÁ÷Á¿£¬Q3Ϊ¶þ¼¶ÐÞÕýÖ®ºóµÄ¹¤¿ö˲ʱÁ÷Á¿¡£ //ÔÚUFG220ģʽÏ£¬»ñÈ¡¼ÆÁ¿°å¹¤¿ö˲ʱÁ¿Ö®ºó£¬Ã¿¸ö˲ʱÁ÷Á¿Öµ¶¼ÐèÒª¾­¹ý´ËÐÞÕý£¬ÔÙ¼ÌÐøºóÐøµÄ³¬Á÷Á¿µÈÂß¼­ÅÐ¶Ï if( Q2 >= real_corr_data_p->second_flow_data_point[0] ) { Q3 = Q2 * real_corr_data_p->second_corr_factor[0]; } else if(Q2 >= real_corr_data_p->second_flow_data_point[1] ) { k = (Q2 - real_corr_data_p->second_flow_data_point[1]) * (real_corr_data_p->second_corr_factor[0] - real_corr_data_p->second_corr_factor[1]) / (real_corr_data_p->second_flow_data_point[0] - real_corr_data_p->second_flow_data_point[1] ) + real_corr_data_p->second_corr_factor[1]; Q3 = Q2 * k; } else if(Q2 >= real_corr_data_p->second_flow_data_point[2] ) { k = (Q2 - real_corr_data_p->second_flow_data_point[2]) * (real_corr_data_p->second_corr_factor[1] - real_corr_data_p->second_corr_factor[2]) / (real_corr_data_p->second_flow_data_point[1] - real_corr_data_p->second_flow_data_point[2] ) + real_corr_data_p->second_corr_factor[2]; Q3 = Q2 * k; } else if(Q2 >= real_corr_data_p->second_flow_data_point[3] ) { k=(Q2 - real_corr_data_p->second_flow_data_point[3]) * (real_corr_data_p->second_corr_factor[2]- real_corr_data_p->second_corr_factor[3]) / (real_corr_data_p->second_flow_data_point[2] - real_corr_data_p->second_flow_data_point[3]) + real_corr_data_p->second_corr_factor[3]; Q3 = Q2 * k; } else if(Q2 >= real_corr_data_p->second_flow_data_point[4] ) { k=(Q2 - real_corr_data_p->second_flow_data_point[4]) * (real_corr_data_p->second_corr_factor[3] - real_corr_data_p->second_corr_factor[4]) / (real_corr_data_p->second_flow_data_point[3] - real_corr_data_p->second_flow_data_point[4] ) + real_corr_data_p->second_corr_factor[4]; Q3 = Q2 * k; } else Q3 = Q2 * real_corr_data_p->second_corr_factor[4]; return (Q3 / 3600); }