/**
|
******************************************************************************
|
* @file embreg.c
|
* @author AndyChen
|
* @version V1.0
|
* @date 2015-xx-xx
|
* @brief
|
******************************************************************************
|
* @attention
|
*
|
******************************************************************************
|
*/
|
|
/* Includes -------------------------------------------------------------------*/
|
|
#include "embreg.h"
|
#include "regmap.h"
|
#include "regdefine.h"
|
|
|
/* Private_Macros -------------------------------------------------------------*/
|
|
|
|
//¼Ä´æÆ÷µØÖ·¼ä¾à
|
#define INDEX_BASE 100
|
|
//Part1 ºÍ Part2µÄµØÖ··Ö½çµã
|
#define PART12_SECTION_P 1049
|
|
//Part3 ºÍ Part4µÄµØÖ··Ö½çµã
|
#define PART34_SECTION_P 1141
|
|
/* Private_TypesDefinitions ---------------------------------------------------*/
|
|
/* Private_Variables ----------------------------------------------------------*/
|
|
/* Private_Functions ----------------------------------------------------------*/
|
|
/**
|
* @brief ¶ÁÊäÈë¼Ä´æÆ÷
|
* @param pucRegBuffer£º·µ»ØÊý¾ÝÖ¸Õë
|
usAddress £ºÊäÈë¼Ä´æÆ÷ÆðʼµØÖ·
|
usNRegs £ºÒª¶ÁµÄ¼Ä´æÆ÷ÊýÄ¿
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
|
{
|
eMBErrorCode eStatus = MB_ENOREG;
|
|
return eStatus;
|
}
|
|
|
|
|
|
|
/**
|
* @brief ¶Á/д±£³Ö¼Ä´æÆ÷
|
* @param pucRegBuffer£ºÊý¾ÝÖ¸Õë
|
usAddress £ºÊäÈë¼Ä´æÆ÷ÆðʼµØÖ·
|
usNRegs £ºÒª²Ù×÷µÄ¼Ä´æÆ÷ÊýÄ¿
|
eMode : ¶Ô±£³Ö¼Ä´æÆ÷µÄ²Ù×÷£¨¶Á»òд£©
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,eMBRegisterMode eMode )
|
{
|
u16 temp;
|
u8 flag=0,i;
|
float sound_set;
|
uint16_t iRegIndex,uRegs;
|
uint16_t regStartAdress, regNum;
|
eMBErrorCode eStatus = MB_ENOERR;
|
u16 frameadd;
|
volatile uint16_t *data_pointer;
|
volatile void *regP=0;
|
volatile uint16_t my_regAddr,tempaddr;
|
volatile uint16_t *bufferpointer;
|
volatile uint16_t *newpointer,*oldpointer;
|
u8 flowfix_flag,flowfix_user_flag;
|
|
flowfix_flag = 0;
|
flowfix_user_flag = 0;
|
|
my_regAddr = usAddress - 1;
|
uRegs = my_regAddr / INDEX_BASE;
|
|
temp=usNRegs;
|
if(uRegs>=10&&uRegs<20)
|
frameadd=(my_regAddr-1000)*2+200;
|
if(uRegs==0)
|
frameadd=my_regAddr*2;
|
|
tempaddr = my_regAddr%1000;
|
|
if( tempaddr == 0)
|
return MB_ENOREG;
|
|
//¸ù¾ÝµØÖ·È·¶¨Òª·ÃÎʵļĴæÆ÷
|
switch( uRegs )
|
{
|
//É豸ÐòÁкżĴæÆ÷
|
case DEVSERIALNUM_FLAG:
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= DEVSERIALNUM_SADDR + DEVSERIALNUM_NREGS)
|
{
|
data_pointer= (void *)®DevSerialNum;
|
usAddress--;
|
}
|
else
|
{
|
eStatus=MB_ENOREG;
|
}
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
//²âÁ¿ÉèÖüĴæÆ÷Part 1 ºÍPart 2
|
case DEVCFGPARAM12_FLAG:
|
if(my_regAddr < PART12_SECTION_P)
|
{
|
regStartAdress = DEVCFGPARAM1_SADDR;
|
regNum = DEVCFGPARAM1_NREGS;
|
regP = ®DevCfgParam_p1;
|
usAddress--;
|
}
|
else
|
{
|
regStartAdress = DEVCFGPARAM2_SADDR;
|
regNum = DEVCFGPARAM2_NREGS;
|
regP = ®DevCfgParam_p2;
|
|
usAddress -= DEVCFGPARAM2_OFFSET;
|
}
|
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= regStartAdress + regNum)
|
{
|
data_pointer = regP;
|
}
|
else
|
{
|
eStatus = MB_ENOREG;
|
}
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
//É豸ÅäÖòÎÊý¼Ä´æÆ÷Part 3 ºÍPart 4
|
case DEVCFGPARAM34_FLAG:
|
if(my_regAddr < PART34_SECTION_P)
|
{
|
regStartAdress = DEVCFGPARAM3_SADDR;
|
regNum = DEVCFGPARAM3_NREGS;
|
|
regP = ®DevCfgParam_p3;
|
usAddress--;
|
}
|
else
|
{
|
regStartAdress = DEVCFGPARAM4_SADDR;
|
regNum = DEVCFGPARAM4_NREGS;
|
|
regP = ®DevCfgParam_p4;
|
usAddress -= DEVCFGPARAM4_OFFSET;
|
}
|
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= regStartAdress + regNum)
|
{
|
data_pointer = regP;
|
}
|
else
|
{
|
eStatus = MB_ENOREG;
|
}
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
case DEVCFGPARAM5_FLAG:
|
regStartAdress = DEVCFGPARAM4_SADDR;
|
regNum = DEVCFGPARAM4_NREGS;
|
|
regP = ®DevCfgParam_p4;
|
usAddress -= DEVCFGPARAM4_OFFSET;
|
|
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= regStartAdress + regNum)
|
{
|
data_pointer = regP;
|
}
|
else
|
{
|
eStatus = MB_ENOREG;
|
}
|
iRegIndex= (usAddress-1100)%200; //******************ÁÙʱµÄ²¹¾È´ëÊ©**************************//
|
break;
|
//É豸ÅäÖòÎÊý¼Ä´æÆ÷Part 5
|
/* case DEVCFGPARAM5_FLAG:
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= DEVCFGPARAM5_SADDR + DEVCFGPARAM5_NREGS)
|
{
|
data_pointer= (void *)®DevCfgParam_p4;
|
usAddress = usAddress - PART5_OFFSET;
|
}
|
else
|
{
|
eStatus=MB_ENOREG;
|
}
|
break;*/
|
|
//Á÷Á¿¼Æ¼ÆÁ¿ÐÅÏ¢¼Ä´æÆ÷
|
case FLOWMETERMSINfO_FLAG:
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= FLOWMETERMSINfO_SADDR + FLOWMETERMSINfO_NREGS)
|
{
|
data_pointer= (void *)®FlowMeterMsInfo;
|
usAddress--;
|
}
|
else
|
{
|
eStatus=MB_ENOREG;
|
}
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
//ϵͳ¹¤×÷״̬¼Ä´æÆ÷
|
case SYSTEMWORKSTATUS_FLAG:
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= SYSTEMWORKSTATUS_SADDR + SYSTEMWORKSTATUS_NREGS)
|
{
|
data_pointer= (void *)®workstatus;
|
usAddress--;
|
}
|
else
|
{
|
eStatus=MB_ENOREG;
|
}
|
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
//µ÷ÊԼĴæÆ÷ 4701
|
case TEST_FLAG:
|
//ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ
|
if(my_regAddr + usNRegs <= TEST_SADDR + TEST_NREGS)
|
{
|
data_pointer= (void *)®TestInfo;
|
usAddress--;
|
}
|
else
|
{
|
eStatus=MB_ENOREG;
|
}
|
iRegIndex= usAddress %100; //****************************************************//
|
break;
|
|
|
//·Ç·¨µØÖ·
|
default:
|
eStatus=MB_ENOREG;
|
break;
|
}
|
|
if(eStatus != MB_ENOREG)
|
{
|
|
iRegIndex--;
|
|
switch(eMode)
|
{
|
//¶Á±£³Ö¼Ä´æÆ÷
|
case MB_REG_READ:
|
while( usNRegs > 0 )
|
{
|
|
if( (my_regAddr>=1175&&my_regAddr<=1180) || ( my_regAddr<1175 && (my_regAddr+usNRegs)>=1175) )
|
{
|
Get_Time();
|
regDevCfgParam_p4.RTCtime_year = calendar.year; //RTCʱ¼ä
|
regDevCfgParam_p4.RTCtime_month = calendar.month;
|
regDevCfgParam_p4.RTCtime_day = calendar.date;
|
regDevCfgParam_p4.RTCtime_hour = calendar.hour;
|
regDevCfgParam_p4.RTCtime_min = calendar.min;
|
regDevCfgParam_p4.RTCtime_sec = calendar.sec;
|
}
|
//»ñÈ¡¸ßλ×Ö½Ú
|
*pucRegBuffer++ = ( uint8_t )( *(data_pointer + iRegIndex) >> 8 );
|
|
//»ñÈ¡µÍλ×Ö½Ú
|
*pucRegBuffer++ = ( uint8_t )( *(data_pointer +iRegIndex) & 0xFF );
|
|
iRegIndex++;
|
|
usNRegs--;
|
}
|
break;
|
|
//д±£³Ö¼Ä´æÆ÷
|
case MB_REG_WRITE:
|
|
if(BT_status)
|
{
|
// buffer_ins_g.system_para_a[0] = usNRegs;
|
// bufferpointer = (u16 *)&buffer_ins_g.system_para_a[1];
|
// *bufferpointer = my_regAddr;
|
// oldpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_OLD_NUM];
|
// newpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_NEW_NUM];
|
// }else
|
// {
|
// buffer_ins_g.system_para_a[0] = 0;
|
// bufferpointer = (u16 *)&buffer_ins_g.system_para_a[1];
|
// *bufferpointer = my_regAddr;
|
// oldpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_OLD_NUM];
|
// newpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_NEW_NUM];
|
|
}
|
while( usNRegs > 0 )
|
{
|
|
/*Ïȱ£´æÔÏȵļĴæÆ÷Öµ*/
|
|
*oldpointer = *(data_pointer + iRegIndex);
|
*(data_pointer + iRegIndex) = *pucRegBuffer++ << 8;
|
*(data_pointer + iRegIndex) |= *pucRegBuffer++;
|
*newpointer = *(data_pointer + iRegIndex);
|
oldpointer ++;
|
newpointer ++;
|
|
|
if( (my_regAddr<=1180)&& (my_regAddr>=1175) )
|
{
|
flag=1;
|
}else if((my_regAddr > 1235)&&(my_regAddr < 1280))
|
{
|
/*ºóÃæµÄ¼Ä´æÆ÷ÊDz»ÐèÒª½øÐд洢µÄ*/
|
|
}
|
else
|
{
|
FM25V02_data_write(*(data_pointer + iRegIndex)&0xff, frameadd++);
|
FM25V02_data_write(*(data_pointer + iRegIndex)>>8, frameadd++);
|
}
|
|
|
|
if( (my_regAddr>=1101&&my_regAddr<=1140) )
|
{
|
flowfix_flag = 1;
|
}else if((my_regAddr>=1240&&my_regAddr<=1279))
|
{
|
flowfix_user_flag = 1;
|
}
|
iRegIndex ++;
|
usNRegs --;
|
}
|
if(flag)
|
Time_Set(regDevCfgParam_p4.RTCtime_year,regDevCfgParam_p4.RTCtime_month,regDevCfgParam_p4.RTCtime_day,1,
|
regDevCfgParam_p4.RTCtime_hour,regDevCfgParam_p4.RTCtime_min,regDevCfgParam_p4.RTCtime_sec);
|
|
// reg_change_dect(my_regAddr);
|
|
if(my_regAddr == 1002)
|
{
|
sound_set = regDevCfgParam_p1.set_sound_speed;
|
//ͨ¹ýÅжϼÆËãµÄÉùËÙÐÞ¸Äʱ¼äÑÓ³Ù¡£
|
if(sound_set == 0)
|
{
|
|
}else
|
{
|
/*¼ÆËã*/
|
regDevCfgParam_p1.mid_a_compensate_time = (regDevCfgParam_p1.mid_distance / sound_set) - regTestInfo.midA + regDevCfgParam_p1.mid_a_compensate_time;
|
FM25V02_data_write_float(MID_A_PROBE_ADD_TIME, regDevCfgParam_p1.mid_a_compensate_time);
|
regDevCfgParam_p1.mid_b_compensate_time = (regDevCfgParam_p1.mid_distance / sound_set) - regTestInfo.midB + regDevCfgParam_p1.mid_b_compensate_time;
|
FM25V02_data_write_float(MID_B_PROBE_ADD_TIME, regDevCfgParam_p1.mid_b_compensate_time);
|
regDevCfgParam_p1.up_a_compensate_time = (regDevCfgParam_p1.up_distance / sound_set) - regTestInfo.upA + regDevCfgParam_p1.up_a_compensate_time;
|
FM25V02_data_write_float(UP_A_PROBE_ADD_TIME, regDevCfgParam_p1.up_a_compensate_time);
|
regDevCfgParam_p1.up_b_compensate_time = (regDevCfgParam_p1.up_distance / sound_set) - regTestInfo.upB + regDevCfgParam_p1.up_b_compensate_time;
|
FM25V02_data_write_float(UP_B_PROBE_ADD_TIME, regDevCfgParam_p1.up_b_compensate_time);
|
regDevCfgParam_p1.down_a_compensate_time = (regDevCfgParam_p1.down_distance / sound_set) - regTestInfo.downA + regDevCfgParam_p1.down_a_compensate_time;
|
FM25V02_data_write_float(DOWN_A_PROBE_ADD_TIME, regDevCfgParam_p1.down_a_compensate_time);
|
regDevCfgParam_p1.down_b_compensate_time = (regDevCfgParam_p1.down_distance / sound_set) - regTestInfo.downB + regDevCfgParam_p1.down_b_compensate_time;
|
FM25V02_data_write_float(DOWN_B_PROBE_ADD_TIME, regDevCfgParam_p1.down_b_compensate_time);
|
}
|
}else if(my_regAddr == 1236)
|
{
|
if(regDevCfgParam_p4.password == regDevCfgParam_p4.userPassword)
|
{
|
regDevCfgParam_p4.confirmpassword = 1111;
|
}else
|
{
|
regDevCfgParam_p4.confirmpassword = 2222;
|
}
|
}else if(my_regAddr == 1237)
|
{
|
if(regDevCfgParam_p4.superpassword == regDevCfgParam_p4.authUsrPassword)
|
{
|
regDevCfgParam_p4.confirmsuperpassword = 1111;
|
}else
|
{
|
regDevCfgParam_p4.confirmsuperpassword = 2222;
|
}
|
|
}
|
|
if(flowfix_flag == 1)
|
{
|
for(i=0;i<10;i++)
|
{
|
if(regDevCfgParam_p3.stdEquipmentFlow[i] != 0)
|
{
|
regDevCfgParam_p2.flowCalibFactor[i] = 1.0/(1+regDevCfgParam_p3.indicationError[i]/100);
|
regDevCfgParam_p2.flowSegmentPoint[i] = regDevCfgParam_p3.stdEquipmentFlow[i]/regDevCfgParam_p2.flowCalibFactor[i];
|
flowfixcount = i + 1;
|
}
|
else
|
{
|
regDevCfgParam_p2.flowCalibFactor[i]=1;
|
regDevCfgParam_p2.flowSegmentPoint[i]=0;
|
|
}
|
}
|
|
|
for(i = 0; i < 10; i ++)
|
{
|
FM25V02_data_write_float((FLOW_CHANGE_K1_ADDR + (u16)(i * 4)),regDevCfgParam_p2.flowCalibFactor[i]);
|
FM25V02_data_write_float((FLOW_CHANGE_L1_ADDR + (u16)(i * 4)),regDevCfgParam_p2.flowSegmentPoint[i]);
|
|
}
|
|
//flowfix_flag=0;
|
}else if(flowfix_user_flag == 1)
|
{
|
for(i = 0 ; i < 10; i ++)
|
{
|
if(regDevCfgParam_p4.user_flow[i] != 0)
|
{
|
regDevCfgParam_p4.user_cal_error[i] = 1.0/(1 + regDevCfgParam_p4.user_error[i]/100);
|
regDevCfgParam_p4.user_cal_flow[i] = regDevCfgParam_p4.user_flow[i] / regDevCfgParam_p4.user_cal_error[i];
|
flowfixcount_user = i + 1;
|
}
|
else
|
{
|
|
regDevCfgParam_p4.user_cal_error[i] = 1;
|
regDevCfgParam_p4.user_cal_flow[i] = 0;
|
|
}
|
}
|
|
|
for(i = 0; i < 10; i ++)
|
{
|
FM25V02_data_write_float((CAL_USER_ERROR_VALUE_E1_ADDR + (u16)(i * 4)), regDevCfgParam_p4.user_cal_error[i]);
|
FM25V02_data_write_float((CAL_USER_REAL_FLOW_R1_ADDR + (u16)(i * 4)), regDevCfgParam_p4.user_cal_flow[i]);
|
|
}
|
|
}
|
|
|
|
|
|
break;
|
|
default:
|
break;
|
}
|
}
|
|
return eStatus;
|
}
|
|
/**
|
* @brief ¶Á/дÏßȦ¼Ä´æÆ÷
|
* @param pucRegBuffer£ºÊý¾ÝÖ¸Õë
|
usAddress £º¼Ä´æÆ÷ÆðʼµØÖ·
|
usNCoils £ºÒª²Ù×÷µÄÏßȦÊýÄ¿
|
eMode £º²Ù×÷ģʽ
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,eMBRegisterMode eMode )
|
{
|
return MB_ENOREG;
|
}
|
|
/**
|
* @brief ¶ÁÀëÉ¢¼Ä´æÆ÷
|
* @param pucRegBuffer£º·µ»ØÊý¾ÝÖ¸Õë
|
usAddress £º¼Ä´æÆ÷ÆðʼµØÖ·
|
usNDiscrete £ºÒª¶ÁµÄ¼Ä´æÆ÷ÊýÄ¿
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
|
{
|
return MB_ENOREG;
|
}
|
|
/******************* (C) COPYRIGHT 2015 AndyChen *******END OF FILE*************/
|