Exemple #1
0
LRESULT CAdcDacDlg::OnSerialLinkEvent(WPARAM WParam, LPARAM LParam)
{
	int MsgType=HIWORD(LParam);
	BYTE Cmd=(BYTE)LOWORD(LParam);
	int AdcVal, Channel;
	CStatic* pStaticAdc[]={&m_StaticAdc0,&m_StaticAdc1,&m_StaticAdc2,&m_StaticAdc3};
	CStatic* pStaticAverAdc[]={&m_StaticAverAdc0,&m_StaticAverAdc1,&m_StaticAverAdc2,&m_StaticAverAdc3};
	CStatic* pStaticDac[]={&m_StaticDac0,&m_StaticDac1};
	static int NSample[4]={0,0,0,0},NAverage[4]={0,0,0,0}, 
		SumSample[4]={0,0,0,0}, SumAverage[4]={0,0,0,0};
	static double DNSample[4]={0,0,0,0}, DNAverage[4]={0,0,0,0};
	if(MsgType==SERIAL_SYNC_MSG)
	{
		if(Cmd==CMD_GET_EXT_ADC || Cmd==CMD_GET_AVERAGED_ADC)
		{
			ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam);

			AdcVal=BytesToShort(msg.Buf[2],msg.Buf[3]);
			Channel=msg.Buf[1];
			if((Channel<0)||(Channel>3))
				return (LRESULT)0;
			char ch[30];
			double delta, sigma;
			if(Cmd==CMD_GET_EXT_ADC)
			{
				NSample[Channel]++;
				SumSample[Channel]+=AdcVal;
				delta=AdcVal-SumSample[Channel]/(double)NSample[Channel];
				DNSample[Channel]+=delta*delta;
				sigma=sqrt(DNSample[Channel]/NSample[Channel]);

			}
			else
			{
				NAverage[Channel]++;
				SumAverage[Channel]+=AdcVal;
				delta=AdcVal-SumAverage[Channel]/(double)NAverage[Channel];
				DNAverage[Channel]+=delta*delta;
				sigma=sqrt(DNAverage[Channel]/NAverage[Channel]);
			}
			double U,I;
			switch(Channel)
			{
			case 1:
				I=BytesToShort(msg.Buf[2],msg.Buf[3])*(4.096/16384.)*(25./2.5); //В Амперах
				sprintf(ch,"%4d, %2.1fA",AdcVal,I);
				break;
			case 2:
				U=BytesToShort(msg.Buf[2],msg.Buf[3])*(4.096/16384.)*(25./2.5); //В Вольтах
				sprintf(ch,"%4d, %2.1fВ",AdcVal,U);
				break;
			default:
				sprintf(ch,"%4d",AdcVal);
			}
			if(Cmd==CMD_GET_EXT_ADC)
				pStaticAdc[Channel]->SetWindowText(ch);
			else
				pStaticAverAdc[Channel]->SetWindowText(ch);
		}
		else if(Cmd==CMD_GET_ADC_TC_I_U_TREF)
		{
			ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam);
			double I, U;
			int Adc0, Adc1, Adc2;
			char ch[30];
			Adc0=BytesToShort(msg.Buf[1],msg.Buf[2]); // Напряжение с термопары
			Adc1=BytesToShort(msg.Buf[3],msg.Buf[4]); // Ток нагревателя
			Adc2=BytesToShort(msg.Buf[5],msg.Buf[6]); // Напряжение на нагревателе
			I=Adc1*(4.096/16384.)*(25./2.5); //В Амперах
			U=Adc2*(4.096/16384.)*(25./2.5); //В Вольтах
			sprintf(ch,"%4d",Adc0);
			pStaticAverAdc[0]->SetWindowText(ch);
			sprintf(ch,"%4d, %2.1fA",Adc1,I);
			pStaticAverAdc[1]->SetWindowText(ch);
			sprintf(ch,"%4d, %2.1fV",Adc2,U);
			pStaticAverAdc[2]->SetWindowText(ch);

		}
		else if(Cmd==CMD_GET_DAC_VAL)
		{
			ComMsg msg=theApp.m_SerialLink.m_Pool.GetMsg(WParam);
			Channel=msg.Buf[1];
			if((Channel<0)||(Channel>1))
				return (LRESULT)0;
			char ch[30];
			AdcVal=BytesToShort(msg.Buf[2],msg.Buf[3]);
			sprintf(ch,"%4d, %2.2fV",AdcVal,AdcVal*(5./16384.));
			pStaticDac[Channel]->SetWindowText(ch);

		}
	}
	else if(MsgType==SERIAL_ERROR_COM_FAILED || MsgType==SERIAL_ERROR_TIMEOUT || MsgType==SERIAL_ASYNC_MSG)
	{
		for(Channel=0;Channel<4;Channel++)
		{
			pStaticAdc[Channel]->SetWindowText("...");
			pStaticAverAdc[Channel]->SetWindowText("...");
			if(Channel<sizeof(pStaticDac)/sizeof(void*))
				pStaticDac[Channel]->SetWindowText("...");
		}

	}
	return (LRESULT)0;
}
unsigned short PacketReader::readShort() {
    return BytesToShort(readChar(), readChar());
}