channelinfo.cpp

来自「数据库开发」· C++ 代码 · 共 318 行

CPP
318
字号
#include "stdafx.h"
#include "channelInfo.h"

CChannelInfo::CChannelInfo()
{
	Init();
}

CChannelInfo::~CChannelInfo()
{
	
}

int CChannelInfo::StringToInt(CString s)
{
	int nReturn = 0;
	char cc[10];
	wsprintf(cc, "%s", s);
	nReturn = atoi(cc);
	return nReturn;
}

float CChannelInfo::StringToFloat(CString s)
{
	float fReturn = 0;
	char cc[10];
	wsprintf(cc, "%s", s);
	fReturn = atof(cc);
	return fReturn;
}

int CChannelInfo::Init()
{
	m_nCount = 0;
	
	for(int i = 0; i < TOTAL_CHANNEL_NUM; i++)
	{
		m_sName[i].Format("模拟量%d", i);
		m_sUnit[i].Format("单位%d", i);
		m_nIndex[i] = i;
		m_bCheat[i] = TRUE;
		m_fMaxsj[i] = 20;
		m_fMinsj[i] = 4;
		m_fMaxll[i] = 100;	
		m_fMinll[i] = 0;	
		m_fSlope[i] = 1;		//斜率校正
		m_fOffset[i]= 0;		//偏移量
		m_fBjsx[i]	= 95;		//报警上限
		m_fBjxx[i]	= 5;		//报警下限
		m_fXssx[i]	= 85;		//显示上限
		m_fXsxx[i]	= 15;		//显示下限
	}
	
	return 0;
}

BOOL CChannelInfo::LoadFromIniFile(CString sPath)
{
	CString sInfoFile;
	sInfoFile = sPath;// + "\\channel.ini";

    TCHAR buffer[1024];
    CStdioFile File;
    CFileException ex;
	CString ss, sz;
	long l = 0;
	int  nCount;
	
    if (!File.Open(sInfoFile, CFile::modeRead | CFile::typeText))
    {
        ex.ReportError();
        return FALSE;
    }

    // Read Header off file
	File.ReadString(buffer, 1024);
	ss.Format("%s", buffer);
	ss.TrimLeft();
	ss.TrimRight();
	if(ss.CompareNoCase("[Channel]"))
	{
		File.Close();
		return FALSE;
	}
			
	nCount = 0;
	while (File.ReadString(buffer, 1024)&&(nCount < TOTAL_CHANNEL_NUM))
	{
		ss.Format("%s", buffer);
		ss.TrimLeft();
		ss.TrimRight();
	
		//通道配置序号
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_nIndex[nCount] = StringToInt(sz);
		ss = ss.Right(ss.GetLength() - l - 1);
		
		//路通道名称
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_sName[nCount] = sz;
		ss = ss.Right(ss.GetLength() - l - 1);
		
		//路工程单位
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_sUnit[nCount] = sz;
		ss = ss.Right(ss.GetLength() - l - 1);
		
		//报警上限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fBjsx[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//报警下限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fBjxx[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//理论上限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fMaxll[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//理论下限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fMinll[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//实际上限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fMaxll[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//实际下限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fMinll[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//斜率
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fSlope[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//偏移
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fOffset[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//显示上限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fXssx[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);
		
		//显示下限
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		m_fXsxx[nCount] = StringToFloat(sz);	
		ss = ss.Right(ss.GetLength() - l - 1);

		//作弊模式
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		if(StringToInt(sz) == 0)
			m_bCheat[nCount] = FALSE;	
		else
			m_bCheat[nCount] = TRUE;	
		ss = ss.Right(ss.GetLength() - l - 1);

		//报警模式 启用/关闭
		l = ss.Find(",", 0);
		sz = ss.Left(l);
		if(StringToInt(sz) == 0)
			m_bBjOn[nCount] = FALSE;	
		else
			m_bBjOn[nCount] = TRUE;	

		nCount++; 
	}		
	m_nCount = nCount; 
	File.Close();
	
	return TRUE;
}

BOOL CChannelInfo::SaveToIniFile(CString sPath)
{
	CString sInfoFile;
	sInfoFile = sPath;// + _T("\\channel.ini");

    CStdioFile File;
    CFileException ex;
	CString ss;
	
    if (!File.Open(sInfoFile, CFile::modeWrite | CFile::modeCreate| CFile::typeText, &ex))
    {
        ex.ReportError();
        return FALSE;
    }

    // Write Header off file
	ss = _T("[Channel]");
	File.WriteString(ss);
	File.WriteString("\n");
	
	for(int i = 0; i < TOTAL_CHANNEL_NUM; i++)
	{
		//通道配置序号
		ss.Format("%d,%s,%s,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,", m_nIndex[i], m_sName[i], m_sUnit[i], m_fBjsx, m_fBjxx, m_fMaxll, m_fMinll, m_fMaxsj, m_fMinsj, m_fSlope[i], m_fOffset[i], m_fXssx[i], m_fXsxx[i]);
		File.WriteString(ss);
				
		if(m_bCheat[i])
			ss.Format("%d,", 1);
		else
			ss.Format("%d,", 0);
		File.WriteString(ss);
		
		if(m_bBjOn[i])
			ss.Format("%d,", 1);
		else
			ss.Format("%d,", 0);
		File.WriteString(ss);
		
		File.WriteString("\n");
	}		
	File.Close();
	
	return TRUE;
}
/*
void CChannelInfo::Clone(CChannelInfo *pData)
{
	for(int i = 0; i < TOTAL_CHANNEL_NUM; i++)
	{
		m_fX[i]		= pData->m_fX[i];
		m_fY[i]		= pData->m_fY[i];
		m_fZ[i]		= pData->m_fZ[i];
		m_fGain[i]  = pData->m_fGain[i];
		m_sName[i]	= pData->m_sName[i];
		m_nIndex[i] = pData->m_nIndex[i];
		m_fSlope[i] = pData->m_fSlope[i];
		m_fMaxmVol[i] = pData->m_fMaxmVol[i];
		m_fOrgmVol[i] = pData->m_fOrgmVol[i];
	}
}
*/

BOOL CChannelInfo::SjToLl(int nChan, float f_sj, float& f_ll)
{
	float fRet;
	int nIndex = nChan - 1;
	if(nChan <= MAX_CHANNEL1_NUM) 
	{
		if(f_sj >= m_fMaxsj[nIndex])
			fRet = m_fMaxsj[nIndex];
		if(f_sj <= m_fMinsj[nIndex])
			fRet = m_fMinsj[nIndex];
		if(m_fMaxsj[nIndex] <= m_fMinsj[nIndex])
		{
			f_ll = m_fMinll[nIndex];
			return TRUE;
		}
		if(m_fMaxll[nIndex] <= m_fMinll[nIndex])
		{
			f_ll = m_fMinll[nIndex];
			return TRUE;
		}
		float f = (f_sj - m_fMinsj[nIndex])/(m_fMaxsj[nIndex] - m_fMinsj[nIndex]); 

		if(m_bCheat[nIndex])
			f_ll = m_fXsxx[nIndex] + f * (m_fXssx[nIndex] - m_fXsxx[nIndex]);
		else
			f_ll = m_fMinll[nIndex] + f * (m_fMaxll[nIndex] - m_fMinll[nIndex]);
		f_ll = f_ll * m_fSlope[nIndex] + m_fOffset[nIndex];
		if((f_ll > m_fBjsx[nIndex]) || (f_ll < m_fBjxx[nIndex]))
			return TRUE;
		else
			return FALSE;
	}else{
		f_ll = 0;
		return TRUE;
	}	
}

void CChannelInfo::SjToLlEx(float* f_sj, float* f_ll, BOOL* bWarn)
{
	
	for(int i = 0; i < MAX_CHANNEL2_NUM; i++)
	{
		f_ll[i] = m_fMaxll[MAX_CHANNEL1_NUM + i] * f_sj[i] * f_sj[i] * f_sj[i];
		f_ll[i] = f_ll[i] + m_fMinll[MAX_CHANNEL1_NUM + i] * f_sj[i] * f_sj[i];
		f_ll[i] = f_ll[i] + m_fMaxsj[MAX_CHANNEL1_NUM + i] * f_sj[i];
		f_ll[i] = f_ll[i] + m_fMinsj[MAX_CHANNEL1_NUM + i];	
		f_ll[i] = f_ll[i] * m_fSlope[MAX_CHANNEL1_NUM + i] + m_fOffset[MAX_CHANNEL1_NUM + i];
					
		if(m_bCheat[MAX_CHANNEL1_NUM + i])
		{
			srand( (unsigned)time( NULL ) );
			float f = (float)rand();
			f = f/RAND_MAX;
			f_ll[i] = m_fXsxx[MAX_CHANNEL1_NUM + i] + f * (m_fXssx[MAX_CHANNEL1_NUM + i] - m_fXsxx[MAX_CHANNEL1_NUM + i]);
		}
		if((f_ll[i] > m_fBjsx[MAX_CHANNEL1_NUM + i]) || (f_ll[i] < m_fBjxx[MAX_CHANNEL1_NUM + i]))
			bWarn[i] = TRUE;
		else
			bWarn[i] = FALSE;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?