LRESULT BacnetController::Fresh_Controller_Item(WPARAM wParam,LPARAM lParam)
{
	int cmp_ret ;//compare if match it will 0;
	int Changed_Item = (int)wParam;
	int Changed_SubItem = (int)lParam;


	CString temp_task_info;
	CString New_CString =  m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
	CString cstemp_value;

	//先保存 原来的值,等结束的时候来比对,看是否有改变,有改变就进行写动作;
	memcpy_s(&m_temp_controller_data[Changed_Item],sizeof(Str_controller_point),&m_controller_data.at(Changed_Item),sizeof(Str_controller_point));


	if(Changed_SubItem == CONTROLLER_INPUT)
	{
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		if(cs_temp.IsEmpty() == false)
		{
			cs_temp.MakeUpper();

			char cTemp1[255];
			char temp_input[250];
			char * tempcs=NULL;
			memset(cTemp1,0,255);
			WideCharToMultiByte( CP_ACP, 0, cs_temp.GetBuffer(), -1, cTemp1, 255, NULL, NULL );
			//Search the input label from the list.

			int temp_number=-1;
			byte temp_value_type = -1;
			byte temp_point_type=-1;
			int temp_panel = -1;
			int temp_net = -1;
			int k=0;
			//int temp1;
			tempcs = ispoint(cTemp1,&temp_number,&temp_value_type,&temp_point_type,&temp_panel,&temp_net,0,Station_NUM,&k);
			if(tempcs!=NULL)
			{
				strcpy(temp_input,tempcs);
				CString temp_des2;
				temp_des2.Empty();

				MultiByteToWideChar( CP_ACP, 0, temp_input, (int)strlen(temp_input)+1, 
					temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
				temp_des2.ReleaseBuffer();		

				m_controller_list.SetItemText(Changed_Item,CONTROLLER_INPUT,temp_des2);

				if(temp_panel != Station_NUM)
				{
					MessageBox(_T("Don't support other panel currently!"),_T("Warning"),MB_OK | MB_ICONINFORMATION);
					m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
					return 0;
				}
				if(temp_number > 0);	//因为Input2  的number 是1;
					temp_number = temp_number - 1;
				temp_point_type = temp_point_type + 1;
				if(2 == temp_point_type)
				{
					m_controller_data.at(Changed_Item).input.number = temp_number;
					m_controller_data.at(Changed_Item).input.panel = temp_panel;//bac_gloab_panel;
					m_controller_data.at(Changed_Item).input.point_type = temp_point_type;//1 means input point

					CString temp_des3;
					if(temp_number < BAC_INPUT_ITEM_COUNT)
					{
						//temp_des3.Format(_T("%d"),m_Input_data.at(temp_number - 1).value);

						CString cstemp_value;
						float temp_float_value;
						temp_float_value = ((float)m_Input_data.at(temp_number).value) / 1000;
						temp_des3.Format(_T("%.1f"),temp_float_value);


						m_controller_data.at(Changed_Item).input_value = m_Input_data.at(temp_number).value;	

						m_controller_list.SetItemText(Changed_Item,CONTROLLER_INPUTVALUE,temp_des3);
					}
				}
				else if(3 == temp_point_type)
				{
					m_controller_data.at(Changed_Item).input.number = temp_number;
					m_controller_data.at(Changed_Item).input.panel = temp_panel;//bac_gloab_panel;
					m_controller_data.at(Changed_Item).input.point_type = temp_point_type;//1 means input point

					CString temp_des3;
					if(temp_number < BAC_VARIABLE_ITEM_COUNT)
					{
						//temp_des3.Format(_T("%d"),m_Input_data.at(temp_number - 1).value);

						CString cstemp_value;
						float temp_float_value;
						temp_float_value = ((float)m_Variable_data.at(temp_number).value) / 1000;
						temp_des3.Format(_T("%.1f"),temp_float_value);


						m_controller_data.at(Changed_Item).input_value = m_Variable_data.at(temp_number).value;	

						m_controller_list.SetItemText(Changed_Item,CONTROLLER_INPUTVALUE,temp_des3);
					}
				}
				else
				{
					m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
					return 0;
				}


			}
			else
			{
				CString temp_message;
				temp_message.Format(_T("%s character not allowed in labels!"),cs_temp.GetString());
				
				MessageBox(temp_message,_T("Information"),MB_OK |MB_ICONINFORMATION);
				m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
				return 0;
			}
		}


	}

	if(Changed_SubItem == CONTROLLER_INPUTVALUE)
	{
		//int temp_value = _wtoi(New_CString);
		int temp_value = (int)(_wtof(New_CString) * 1000);

		if(m_controller_data.at(Changed_Item).input.number == 0 )
			return 0;
		if((m_controller_data.at(Changed_Item).input.number -1 )< BAC_INPUT_ITEM_COUNT)
			m_Input_data.at(m_controller_data.at(Changed_Item).input.number - 1).value = temp_value;
		
		temp_task_info.Format(_T("Write Controllers List Item%d .Changed the input value to \"%s\" "),Changed_Item + 1,New_CString);
		Post_Write_Message(g_bac_instance,WRITEINPUT_T3000,Changed_Item,Changed_Item,sizeof(Str_in_point),BacNet_hwd ,temp_task_info);
		return 0;
	}




	if(Changed_SubItem == CONTROLLER_SETVALUE)
	{
	//	int temp_value = _wtoi(New_CString);
		int temp_value = (int)(_wtof(New_CString) * 1000);
		if(m_controller_data.at(Changed_Item).setpoint.number == 0 )
			return 0;
		if((m_controller_data.at(Changed_Item).setpoint.number -1 )< BAC_VARIABLE_ITEM_COUNT)
			m_Variable_data.at(m_controller_data.at(Changed_Item).setpoint.number - 1).value = temp_value;

		temp_task_info.Format(_T("Write Controllers List Item%d .Changed the variable value to \"%s\" "),Changed_Item + 1,New_CString);
		Post_Write_Message(g_bac_instance,WRITEVARIABLE_T3000,Changed_Item,Changed_Item,sizeof(Str_in_point),BacNet_hwd ,temp_task_info);
		return 0;
	}

	if(Changed_SubItem == CONTROLLER_AUTO_MANUAL)
	{
		CString temp_cs = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		if(temp_cs.CompareNoCase(_T("Auto"))==0)
		{
			m_controller_list.SetCellEnabled(Changed_Item,CONTROLLER_OUTPUT,0);
			m_controller_data.at(Changed_Item).auto_manual = BAC_AUTO ;
		}
		else
		{
			m_controller_list.SetCellEnabled(Changed_Item,CONTROLLER_OUTPUT,1);
			m_controller_data.at(Changed_Item).auto_manual = BAC_MANUAL ;
		}
	}

	if(Changed_SubItem == CONTROLLER_OUTPUT)
	{
		CString temp_cs = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);

		int temp_int = (int)(_wtof(temp_cs) * 1000);
		m_controller_data.at(Changed_Item).value = temp_int;
	}

	if(Changed_SubItem == CONTROLLER_SETPOINT)
	{
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		char cTemp1[255];
		char temp_setpoint[250];
		char * tempcs=NULL;
		memset(cTemp1,0,255);
		memset(temp_setpoint,0,250);
		WideCharToMultiByte( CP_ACP, 0, cs_temp.GetBuffer(), -1, cTemp1, 255, NULL, NULL );

		int temp_number=-1;
		byte temp_value_type = -1;
		byte temp_point_type=-1;
		int temp_panel = -1;
		int temp_net = -1;
		int k=0;
		//int temp1;
		//Change the lable.ex: Change the
		tempcs = ispoint(cTemp1,&temp_number,&temp_value_type,&temp_point_type,&temp_panel,&temp_net,0,bac_gloab_panel,&k);
		if(tempcs!=NULL)
		{
			memcpy_s(temp_setpoint,250,tempcs,9);
			//strcpy_s(temp_setpoint,tempcs);
			//strcpy(temp_setpoint,tempcs);
			CString temp_des2;
			temp_des2.Empty();

			MultiByteToWideChar( CP_ACP, 0, temp_setpoint, STR_VARIABLE_LABEL+1, 
				temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
			temp_des2.ReleaseBuffer();		
			
			m_controller_list.SetItemText(Changed_Item,CONTROLLER_SETPOINT,temp_des2);


			if(temp_panel != bac_gloab_panel)
			{
				MessageBox(_T("Don't support other panel currently!"),_T("Warning"),MB_OK | MB_ICONINFORMATION);
				m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
				return 0;
			}
			if(temp_number > 0)	//Setpoint 也是这样;从0 开始的;
				temp_number = temp_number - 1;
			temp_point_type = temp_point_type + 1; //OUTPUT=1, INPUT, VARIABLE 要错位;
			m_controller_data.at(Changed_Item).setpoint.number = temp_number;
			m_controller_data.at(Changed_Item).setpoint.panel = temp_panel;//bac_gloab_panel;
			m_controller_data.at(Changed_Item).setpoint.point_type = temp_point_type;//1 means input point

			CString temp_des3;
			if(temp_number < BAC_VARIABLE_ITEM_COUNT)
			{
				if(m_Variable_data.at(temp_number).range < VARIABLE_ANALOG_UNITE_COUNT)
					temp_des3 = Variable_Analog_Units_Array[m_Variable_data.at(temp_number).range];
				m_controller_list.SetItemText(Changed_Item,CONTROLLER_SETPOINTUNITS,temp_des3);
			}
			char tempAAAA[250];
			memset(tempAAAA,0,250);
			temp_des3.Empty();
			if(m_Variable_data.at(temp_number).range  == 20 )
			{
				if((m_controller_data.at(Changed_Item).setpoint_value>=0)&&(m_controller_data.at(Changed_Item).setpoint_value<86400))
					intervaltotext( tempAAAA, m_controller_data.at(Changed_Item).setpoint_value ,0 , 0);

				MultiByteToWideChar( CP_ACP, 0, tempAAAA, strlen(tempAAAA) + 1, 
					temp_des3.GetBuffer(MAX_PATH), MAX_PATH );
				temp_des3.ReleaseBuffer();	
			}
			else
			{
				CString cstemp_value;
				float temp_float_value;
				temp_float_value = ((float)m_Variable_data.at(m_controller_data.at(Changed_Item).setpoint.number).value) / 1000;
				temp_des3.Format(_T("%.1f"),temp_float_value);

			}
	
			m_controller_list.SetItemText(Changed_Item,CONTROLLER_SETVALUE,temp_des3);

		}
		else
		{
			CString temp_show_ret;
			temp_show_ret = _T("\"") + cs_temp + _T("\"") + _T(" is a invalid label or keyword .");
			SetPaneString(BAC_SHOW_MISSION_RESULTS,temp_show_ret);
			m_controller_list.SetItemText(Changed_Item,CONTROLLER_SETPOINT,_T(""));
		}
	}

	if(Changed_SubItem == CONTROLLER_PROPORTIONAL)
	{
		int temp_proportional=0;
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		if((cs_temp.GetLength()>3) || (_wtoi(cs_temp)>255) )
		{
			MessageBox(_T("Please input a effective value"),_T("Information"),MB_OK |MB_ICONINFORMATION);
			m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
		}
		else
		{
			m_controller_data.at(Changed_Item).proportional = _wtoi(cs_temp);
		}
	}
	if(Changed_SubItem == CONTROLLER_RESET)
	{
		int temp_reset=0;
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		if((cs_temp.GetLength()>3) || (_wtoi(cs_temp)>255) )
		{
			MessageBox(_T("Please input a effective value"),_T("Information"),MB_OK |MB_ICONINFORMATION);
			m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
		}
		else
		{
			m_controller_data.at(Changed_Item).reset = _wtoi(cs_temp);
		}
	}

	if(Changed_SubItem == CONTROLLER_RATE)
	{
		int temp_rate=0;
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);

		int i_value =  (int)(_wtof(cs_temp) * 100) ;

		if((i_value > 200) || (i_value < 0))
		//if((cs_temp.GetLength()>1) || (_wtoi(cs_temp)>2) )
		{
			MessageBox(_T("Please input a effective value  0.00 - 2.00"),_T("Information"),MB_OK |MB_ICONINFORMATION);
			m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
		}
		else
		{
			m_controller_data.at(Changed_Item).rate = i_value;
		}
	}

	if(Changed_SubItem == CONTROLLER_BIAS)
	{
		int temp_bias=0;
		CString cs_temp = m_controller_list.GetItemText(Changed_Item,Changed_SubItem);
		if((cs_temp.GetLength()>3) || (_wtoi(cs_temp)>100) )
		{
			MessageBox(_T("Please input a effective value"),_T("Information"),MB_OK |MB_ICONINFORMATION);
			m_controller_list.SetItemText(Changed_Item,Changed_SubItem,_T(""));
		}
		else
		{
			m_controller_data.at(Changed_Item).bias = _wtoi(cs_temp);
		}
	}



	cmp_ret = memcmp(&m_temp_controller_data[Changed_Item],&m_controller_data.at(Changed_Item),sizeof(Str_controller_point));
	if(cmp_ret!=0)
	{
		m_controller_list.SetItemBkColor(Changed_Item,Changed_SubItem,LIST_ITEM_CHANGED_BKCOLOR);
		temp_task_info.Format(_T("Write Controllers List Item%d .Changed to \"%s\" "),Changed_Item + 1,New_CString);
		Post_Write_Message(g_bac_instance,WRITEPID_T3000,Changed_Item,Changed_Item,sizeof(Str_controller_point),m_controller_dlg_hwnd ,temp_task_info,Changed_Item,Changed_SubItem);

	}


	
	return 0;
}
LRESULT BacnetController::Fresh_Controller_List(WPARAM wParam,LPARAM lParam)
{
	CString temp_des2;
	CString temp_des3;
	CString temp_in_unit;
	CString temp_set_unit;
	int Fresh_Item;
	int isFreshOne = (int)lParam;
	if(isFreshOne == REFRESH_ON_ITEM)
	{
		Fresh_Item = (int)wParam;
	}
	else
	{
#if 1
		if(m_controller_list.IsDataNewer((char *)&m_controller_data.at(0),sizeof(Str_controller_point) * BAC_PID_COUNT))
		{
			//避免list 刷新时闪烁;在没有数据变动的情况下不刷新List;
			m_controller_list.SetListData((char *)&m_controller_data.at(0),sizeof(Str_controller_point) * BAC_PID_COUNT);
		}
		else
		{
			//return 0;
		}
#endif
	}
	


	for (int i=0;i<(int)m_controller_data.size();i++)
	{
		if(i>=controller_item_limit_count)
			break;

		if(isFreshOne)
		{
			i = Fresh_Item;
		}

		temp_des2.Empty();

		if(2 == m_controller_data.at(i).input.point_type)
		{
			if(m_controller_data.at(i).input.number< BAC_INPUT_ITEM_COUNT)
			{	
					MultiByteToWideChar( CP_ACP, 0, (char *)m_Input_data.at(m_controller_data.at(i).input.number ).label, 
						(int)strlen((char *)m_Input_data.at(m_controller_data.at(i).input.number ).label)+1, 
						temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
					temp_des2.ReleaseBuffer();	


					if(temp_des2.GetLength()>9)
						temp_des2.Format(_T("%d-IN%d"),m_controller_data.at(i).input.panel,m_controller_data.at(i).input.number);
					if(temp_des2.IsEmpty())
						temp_des2.Format(_T("%d-IN%d"),m_controller_data.at(i).input.panel,m_controller_data.at(i).input.number);

					//temp_des3.Format(_T("%d"),m_Input_data.at(m_controller_data.at(i).input.number - 1).value);	
					CString cstemp_value;
					float temp_float_value;
					temp_float_value = ((float)m_controller_data.at(i).input_value) / 1000;

					cstemp_value.Format(_T("%.1f"),temp_float_value);
					m_controller_list.SetItemText(i,CONTROLLER_INPUTVALUE,cstemp_value);


					//********************************************************************************************************
					// bind the the input units.
					int x = m_controller_data.at(i).input.number;
					if(m_Input_data.at(x).digital_analog == BAC_UNITS_ANALOG)
					{
						m_controller_list.SetItemText(i,CONTROLLER_INPUTUNITS,Input_List_Analog_Units[m_Input_data.at(x).range]);
					}
			
			}
		}
		else if(3 == m_controller_data.at(i).input.point_type)
		{
			if(m_controller_data.at(i).input.number< BAC_VARIABLE_ITEM_COUNT)
			{	
					MultiByteToWideChar( CP_ACP, 0, (char *)m_Variable_data.at(m_controller_data.at(i).input.number ).label, 
						(int)strlen((char *)m_Variable_data.at(m_controller_data.at(i).input.number ).label)+1, 
						temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
					temp_des2.ReleaseBuffer();	



					if(temp_des2.GetLength()>9)
						temp_des2.Format(_T("%d-VAR%d"),m_controller_data.at(i).input.panel,m_controller_data.at(i).input.number);
					if(temp_des2.IsEmpty())
						temp_des2.Format(_T("%d-VAR%d"),m_controller_data.at(i).input.panel,m_controller_data.at(i).input.number);

					//temp_des3.Format(_T("%d"),m_Input_data.at(m_controller_data.at(i).input.number - 1).value);	
					CString cstemp_value;
					float temp_float_value;
					temp_float_value = ((float)m_controller_data.at(i).input_value) / 1000;

					cstemp_value.Format(_T("%.1f"),temp_float_value);
					m_controller_list.SetItemText(i,CONTROLLER_INPUTVALUE,cstemp_value);


					//********************************************************************************************************
					// bind the the input units.
					int x = m_controller_data.at(i).input.number;
					if(m_Variable_data.at(x).digital_analog == BAC_UNITS_ANALOG)
					{
						if(m_Variable_data.at(x).range <= sizeof(Variable_Analog_Units_Array)/sizeof(Variable_Analog_Units_Array[0]))
							m_controller_list.SetItemText(i,CONTROLLER_INPUTUNITS,Variable_Analog_Units_Array[m_Variable_data.at(x).range]);
					}
			
			}
		}
		else
		{
			m_controller_list.SetItemText(i,CONTROLLER_INPUTVALUE,_T(""));
			m_controller_list.SetItemText(i,CONTROLLER_INPUTUNITS,_T(""));
		}
		
		m_controller_list.SetItemText(i,CONTROLLER_INPUT,temp_des2);

		float persend_data;
		persend_data = ((float)m_controller_data.at(i).value)/ 1000;
		CString temp_output_value;
		temp_output_value.Format(_T("%.1f%%"),persend_data);
		m_controller_list.SetItemText(i,CONTROLLER_OUTPUT,temp_output_value);

		//CString temp_sample_time;
		//temp_sample_time.Format(_T("%u"),m_controller_data.at(i).sample_time);
		//m_controller_list.SetItemText(i,CONTROLLER_SAMPLE_TIME,temp_sample_time);
		//temp_des2.Format(_T("%d"),m_controller_data.at(i).input_value);
		//m_controller_list.SetItemText(i,CONTROLLER_INPUTVALUE,temp_des2);

		//if(m_controller_data.at(i).input.number < BAC_INPUT_ITEM_COUNT)
		//{
		//	if(m_Input_data.at(m_controller_data.at(i).input.number).range < INPUT_ANOLAG_UNITE_COUNT)
		//		m_controller_list.SetItemText(i,CONTROLLER_INPUTUNITS,Input_List_Analog_Units[m_Input_data.at(m_controller_data.at(i).input.number).range]);
		//	else
		//		m_controller_list.SetItemText(i,CONTROLLER_INPUTUNITS,_T(""));
		//}
		
			
		temp_des2.Empty();
		temp_des3.Empty();
		temp_set_unit.Empty();
		if(m_controller_data.at(i).setpoint.point_type == 1) 
		{
			if(m_controller_data.at(i).setpoint.number< BAC_OUTPUT_ITEM_COUNT)
			{

			}
		}
		else if(m_controller_data.at(i).setpoint.point_type == 2) 
		{
			if(m_controller_data.at(i).setpoint.number< BAC_INPUT_ITEM_COUNT)
			{
					int num_point,num_panel,num_net,k;
					Point_T3000 point;
					point.number = m_controller_data.at(i).setpoint.number;
					point.number = point.number + 1;	//input setpoint 是从 0 开始计数的 ,但是要去找point label 要从1开始;
					point.panel = m_controller_data.at(i).setpoint.panel;
					point.point_type = m_controller_data.at(i).setpoint.point_type - 1;	//调用 ispoint的时候要减一;
					byte point_type,var_type;

					int temp_network = 0;
					char buf[255];
					char q[17];
					pointtotext_for_controller(q, &point);

					char * temp1 = ispoint(q,&num_point,&var_type, &point_type, &num_panel, &num_net, temp_network, point.panel, &k);
					if(temp1!=NULL)
					{
						if(strlen(temp1) < 255)
						{
							strcpy(buf,temp1);

							MultiByteToWideChar( CP_ACP, 0, (char *)buf,(int)strlen((char *)buf)+1, 
								temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
							temp_des2.ReleaseBuffer();	

							float temp_float_value;
							temp_float_value = ((float)m_controller_data.at(i).setpoint_value) / 1000;
							temp_des3.Format(_T("%.1f"),temp_float_value);



							int x = m_controller_data.at(i).setpoint.number;
							if(m_Input_data.at(x).digital_analog == BAC_UNITS_ANALOG)
							{

								if(m_Input_data.at(x).range <  (sizeof(Input_List_Analog_Units)/sizeof(Input_List_Analog_Units[0])))
									temp_set_unit = Input_List_Analog_Units[m_Input_data.at(x).range];
									
							}
						}
					}
				
			}
		}
		else if(m_controller_data.at(i).setpoint.point_type == 3)	//Variable
		{
			if(m_controller_data.at(i).setpoint.number< BAC_VARIABLE_ITEM_COUNT)
			{
				int num_point,num_panel,num_net,k;
				Point_T3000 point;
				point.number = m_controller_data.at(i).setpoint.number;
				point.number = point.number + 1;	//input setpoint 是从 0 开始计数的 ,但是要去找point label 要从1开始;
				point.panel = m_controller_data.at(i).setpoint.panel;
				point.point_type = m_controller_data.at(i).setpoint.point_type - 1;	//调用 ispoint的时候要减一;
				byte point_type,var_type;

				int temp_network = 0;
				char buf[255];
				char q[17];
				pointtotext_for_controller(q, &point);

				char * temp1 = ispoint(q,&num_point,&var_type, &point_type, &num_panel, &num_net, temp_network, point.panel, &k);
				if(temp1!=NULL)
				{
					if(strlen(temp1) < 255)
					{
						strcpy(buf,temp1);

						MultiByteToWideChar( CP_ACP, 0, (char *)buf,(int)strlen((char *)buf)+1, 
							temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
						temp_des2.ReleaseBuffer();	

						float temp_float_value;
						temp_float_value = ((float)m_controller_data.at(i).setpoint_value) / 1000;
						temp_des3.Format(_T("%.1f"),temp_float_value);



						int x = m_controller_data.at(i).setpoint.number;
						if(m_Variable_data.at(x).digital_analog == BAC_UNITS_DIGITAL)
						{


							if(m_Variable_data.at(x).range>30)
							{
								temp_set_unit = _T("");
							}
							else
							{
								CString temp1;
								CStringArray temparray;

								if((m_Variable_data.at(x).range < 23) &&(m_Variable_data.at(x).range !=0))
									temp1 = Digital_Units_Array[m_Variable_data.at(x).range];
								else if((m_Variable_data.at(x).range >=23) && (m_Variable_data.at(x).range <= 30))
								{
									if(receive_customer_unit)
										temp1 = temp_unit_no_index[m_Variable_data.at(x).range - 23];
								}

								SplitCStringA(temparray,temp1,_T("/"));
								if((temparray.GetSize()==2))
								{
									if(m_Variable_data.at(x).control == 0)
										temp_set_unit = temparray.GetAt(0);
									else
										temp_set_unit = temparray.GetAt(1);
								}

							}
						}
						else
						{
							if(m_Variable_data.at(x).range == 20)	//如果是时间;
							{
								temp_set_unit = Variable_Analog_Units_Array[m_Variable_data.at(x).range];
								char temp_char[50];
								int time_seconds = m_Variable_data.at(x).value / 1000;
								intervaltotext(temp_char,time_seconds,0,0);
								CString temp_11;
								MultiByteToWideChar( CP_ACP, 0, temp_char, strlen(temp_char) + 1, 
									temp_11.GetBuffer(MAX_PATH), MAX_PATH );
								temp_11.ReleaseBuffer();		
								
								temp_set_unit = temp_11;
								//temp_value.Format(_T("%d"),m_Variable_data.at(i).value);
								//m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_value);
							}
							else if(m_Variable_data.at(x).range<=sizeof(Variable_Analog_Units_Array)/sizeof(Variable_Analog_Units_Array[0]))
							{
								//m_variable_list.SetItemText(i,VARIABLE_UNITE,Variable_Analog_Units_Array[m_Variable_data.at(i).range]);
								temp_set_unit = Variable_Analog_Units_Array[m_Variable_data.at(x).range];
								//CString cstemp_value;
								//float temp_float_value;
								//temp_float_value = ((float)m_Variable_data.at(i).value) / 1000;
								//cstemp_value.Format(_T("%.3f"),temp_float_value);
								//m_variable_list.SetItemText(i,VARIABLE_VALUE,cstemp_value);

								//temp_value.Format(_T("%d"),m_Variable_data.at(i).value);
								//m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_value);
							}
						}





					}
				}
			}
		}
#if 0
		if(m_controller_data.at(i).setpoint.number< BAC_VARIABLE_ITEM_COUNT)
		{	
			if(m_controller_data.at(i).setpoint.point_type == 0 )
				temp_des2.Empty();
			else
			{
				int num_point,num_panel,num_net,k;
				Point_T3000 point;
				point.number = m_controller_data.at(i).setpoint.number;
				point.number = point.number + 1;	//input setpoint 是从 0 开始计数的 ,但是要去找point label 要从1开始;
				point.panel = m_controller_data.at(i).setpoint.panel;
				point.point_type = m_controller_data.at(i).setpoint.point_type;
				byte point_type,var_type;
				
				int temp_network = 0;
				char buf[255];
				char q[17];
				pointtotext_for_controller(q, &point);

				char * temp1 = ispoint(q,&num_point,&var_type, &point_type, &num_panel, &num_net, temp_network, point.panel, &k);
				if(temp1!=NULL)
				{
					if(strlen(temp1) < 255)
					{
						strcpy(buf,temp1);

						MultiByteToWideChar( CP_ACP, 0, (char *)buf,(int)strlen((char *)buf)+1, 
							temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
						temp_des2.ReleaseBuffer();	
					}
				}

#if 0
				MultiByteToWideChar( CP_ACP, 0, (char *)m_Variable_data.at(m_controller_data.at(i).setpoint.number - 1).label, 
					(int)strlen((char *)m_Variable_data.at(m_controller_data.at(i).setpoint.number - 1).label)+1, 
					temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
				temp_des2.ReleaseBuffer();	
				if(temp_des2.GetLength()>9)//如果获取的Var长度大于9,说明获取的Label不对,也要重置;
				{
					temp_des2.Empty();
					temp_des3.Empty();
				}
				else
				{
					CString cstemp_value;
					float temp_float_value;
					temp_float_value = ((float)m_Variable_data.at(m_controller_data.at(i).setpoint.number - 1).value) / 1000;
					temp_des3.Format(_T("%.1f"),temp_float_value);
					

					//temp_des3.Format(_T("%d"),m_Variable_data.at(m_controller_data.at(i).setpoint.number - 1).value);
				}
				if(m_Variable_data.at(i).digital_analog == BAC_UNITS_ANALOG)
				{
					if(m_Variable_data.at(i).range<=sizeof(Variable_Analog_Units_Array)/sizeof(Variable_Analog_Units_Array[0]))
					{
						m_controller_list.SetItemText(i,CONTROLLER_SETPOINTUNITS,Variable_Analog_Units_Array[m_Variable_data.at(m_controller_data.at(i).setpoint.number - 1).range]);
						//temp_value.Format(_T("%d"),m_Variable_data.at(i).value);
						//m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_value);
					}
				}
#endif
			}


			

			
		}
#endif
		m_controller_list.SetItemText(i,CONTROLLER_SETPOINT,temp_des2);
		m_controller_list.SetItemText(i,CONTROLLER_SETVALUE,temp_des3);
		m_controller_list.SetItemText(i,CONTROLLER_SETPOINTUNITS,temp_set_unit);
	
		//if(m_controller_data.at(i).units < VARIABLE_ANALOG_UNITE_COUNT)
		//	m_controller_list.SetItemText(i,CONTROLLER_SETPOINTUNITS,Variable_Analog_Units_Array[m_controller_data.at(i).units]);
		//else
		//	m_controller_list.SetItemText(i,CONTROLLER_SETPOINTUNITS,_T(""));


		if(m_controller_data.at(i).action == 0)
		{
			m_controller_list.SetItemText(i,CONTROLLER_ACTION,_T("-"));
		}
		else if(m_controller_data.at(i).action >= 1)
		{
			m_controller_list.SetItemText(i,CONTROLLER_ACTION,_T("+"));
		}
		//else
		//{
		//	m_controller_list.SetItemText(i,CONTROLLER_SETPOINTUNITS,_T(""));
		//}

		temp_des3.Format(_T("%d"),m_controller_data.at(i).proportional);
		m_controller_list.SetItemText(i,CONTROLLER_PROPORTIONAL,temp_des3);

		temp_des3.Format(_T("%d"),m_controller_data.at(i).reset);
		m_controller_list.SetItemText(i,CONTROLLER_RESET,temp_des3);


		if(m_controller_data.at(i).auto_manual==0)
		{
			m_controller_list.SetItemText(i,CONTROLLER_AUTO_MANUAL,_T("Auto"));
			m_controller_list.SetCellEnabled(i,CONTROLLER_OUTPUT,0);
		}
		else
		{
			m_controller_list.SetItemText(i,CONTROLLER_AUTO_MANUAL,_T("Manual"));
			m_controller_list.SetCellEnabled(i,CONTROLLER_OUTPUT,1);
		}


		if(m_controller_data.at(i).bias<=100)
		{
			temp_des3.Format(_T("%d"),m_controller_data.at(i).bias);
			m_controller_list.SetItemText(i,CONTROLLER_BIAS,temp_des3);
		}
		else
		{
			m_controller_data.at(i).bias = 0;
			m_controller_list.SetItemText(i,CONTROLLER_BIAS,_T("0"));
		}

		if(m_controller_data.at(i).rate<=200)
		{
			temp_des3.Format(_T("%.2f"),((float)m_controller_data.at(i).rate)/100);
			m_controller_list.SetItemText(i,CONTROLLER_RATE,temp_des3);
		}
		else
		{
			m_controller_data.at(i).rate = 0;
			m_controller_list.SetItemText(i,CONTROLLER_RATE,_T("0"));
		}

		if(isFreshOne)
		{
			break;
		}
	
	}
	
	return	 0;
}
LRESULT CBacnetVariable::Fresh_Variable_Item(WPARAM wParam,LPARAM lParam)
{
	int cmp_ret ;//compare if match it will 0;

	int Changed_Item = (int)wParam;
	int Changed_SubItem = (int)lParam;
	CString temp_task_info;
	CString New_CString =  m_variable_list.GetItemText(Changed_Item,Changed_SubItem);
	CString cstemp_value;
	memcpy_s(&m_temp_variable_data[Changed_Item],sizeof(Str_variable_point),&m_Variable_data.at(Changed_Item),sizeof(Str_variable_point));


	if(Changed_SubItem == VARIABLE_LABLE)
	{
		CString cs_temp = m_variable_list.GetItemText(Changed_Item,Changed_SubItem);
		if(cs_temp.GetLength()>= STR_VARIABLE_LABEL)	//长度不能大于结构体定义的长度;
		{
			MessageBox(_T("Length can not higher than 9"),_T("Warning"));
			PostMessage(WM_REFRESH_BAC_VARIABLE_LIST,NULL,NULL);
			return 0;
		}

		char cTemp1[255];
		memset(cTemp1,0,255);
		WideCharToMultiByte( CP_ACP, 0, cs_temp.GetBuffer(), -1, cTemp1, 255, NULL, NULL );
		memcpy_s(m_Variable_data.at(Changed_Item).label,STR_VARIABLE_LABEL,cTemp1,STR_VARIABLE_LABEL);
	}

	if(Changed_SubItem == VARIABLE_FULL_LABLE)
	{
		CString cs_temp = m_variable_list.GetItemText(Changed_Item,Changed_SubItem);
		if(cs_temp.GetLength()>= STR_VARIABLE_DESCRIPTION_LENGTH)	//长度不能大于结构体定义的长度;
		{
			MessageBox(_T("Length can not higher than 20"),_T("Warning"));
			PostMessage(WM_REFRESH_BAC_VARIABLE_LIST,NULL,NULL);
			return 0;
		}

		char cTemp1[255];
		memset(cTemp1,0,255);
		WideCharToMultiByte( CP_ACP, 0, cs_temp.GetBuffer(), -1, cTemp1, 255, NULL, NULL );
		memcpy_s(m_Variable_data.at(Changed_Item).description,STR_VARIABLE_DESCRIPTION_LENGTH,cTemp1,STR_VARIABLE_DESCRIPTION_LENGTH);
	}


	if(Changed_SubItem == VARIABLE_AUTO_MANUAL)
	{
		CString temp_cs = m_variable_list.GetItemText(Changed_Item,Changed_SubItem);
		if(temp_cs.CompareNoCase(_T("Auto"))==0)
		{
			m_variable_list.SetCellEnabled(Changed_Item,VARIABLE_VALUE,0);
			m_Variable_data.at(Changed_Item).auto_manual = BAC_AUTO;
		}
		else
		{
			m_variable_list.SetCellEnabled(Changed_Item,VARIABLE_VALUE,1);
			m_Variable_data.at(Changed_Item).auto_manual = BAC_MANUAL;
		}
	}
	if(Changed_SubItem == VARIABLE_VALUE)//这里只用处理 ANALOG 的值就看要了, DIGITAL 的值在Click 事件中处理过了;
	{
		CString temp_cs = m_variable_list.GetItemText(Changed_Item,Changed_SubItem);

		int temp_int = (int)(_wtof(temp_cs) * 1000);
		m_Variable_data.at(Changed_Item).value = temp_int;
		//int temp_int = _wtoi(temp_cs);
		//m_Variable_data.at(Changed_Item).value = temp_int;
	}
	if(Changed_SubItem == VARIABLE_UNITE)
	{
		BacnetRange dlg;
		CString temp_cs = m_variable_list.GetItemText(Changed_Item,Changed_SubItem);
		if(temp_cs.CompareNoCase(Units_Type[UNITS_TYPE_ANALOG])==0)
		{



			bac_ranges_type = VARIABLE_RANGE_ANALOG_TYPE;
			dlg.DoModal();
			if(range_cancel)
			{
				PostMessage(WM_REFRESH_BAC_VARIABLE_LIST,Changed_Item,REFRESH_ON_ITEM);//这里调用 刷新线程重新刷新会方便一点;
				return 0;
			}
			m_Variable_data.at(Changed_Item).digital_analog = BAC_UNITS_ANALOG;
			m_Variable_data.at(Changed_Item).range = bac_range_number_choose;
			m_variable_list.SetItemText(Changed_Item,Changed_SubItem,Variable_Analog_Units_Array[bac_range_number_choose]);


			
			if(m_Variable_data.at(Changed_Item).range == 20)	//如果是时间;
			{
				char temp_char[50];
				int time_seconds = m_Variable_data.at(Changed_Item).value / 1000;
				intervaltotext(temp_char,time_seconds,0,0);
				
				CString temp_11;
				MultiByteToWideChar( CP_ACP, 0, temp_char, strlen(temp_char) + 1, 
					temp_11.GetBuffer(MAX_PATH), MAX_PATH );
				temp_11.ReleaseBuffer();		
				m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,temp_11);

			}
			else
			{
				CString cstemp_value;
				float temp_float_value;
				temp_float_value = ((float)m_Variable_data.at(Changed_Item).value) / 1000;
				cstemp_value.Format(_T("%.3f"),temp_float_value);
				m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,cstemp_value);

/*				cstemp_value.Format(_T("%d"),m_Variable_data.at(Changed_Item).value);
				m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,cstemp_value);*/	
			}

		}
		else if(temp_cs.CompareNoCase(Units_Type[UNITS_TYPE_DIGITAL])==0)
		{
			bac_ranges_type = VARIABLE_RANGE_DIGITAL_TYPE;
			dlg.DoModal();
			if(range_cancel)
			{
				PostMessage(WM_REFRESH_BAC_VARIABLE_LIST,Changed_Item,REFRESH_ON_ITEM);//这里调用 刷新线程重新刷新会方便一点;
				return 0;
			}
			m_Variable_data.at(Changed_Item).digital_analog = BAC_UNITS_DIGITAL;
			m_Variable_data.at(Changed_Item).range = bac_range_number_choose;

			CString temp1;
			CStringArray temparray;

			temp1 = Digital_Units_Array[bac_range_number_choose];//22 is the sizeof the array
			SplitCStringA(temparray,temp1,_T("/"));

			

			if(m_Variable_data.at(Changed_Item).control == 1)
			{
				if((temparray.GetSize()==2)&&(!temparray.GetAt(1).IsEmpty()))
				{
					m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,temparray.GetAt(1));
				}
			}
			else
			{
				if((temparray.GetSize()==2)&&(!temparray.GetAt(0).IsEmpty()))
				{
					m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,temparray.GetAt(0));
				}			
			}
			m_variable_list.SetItemText(Changed_Item,VARIABLE_UNITE,temp1);

		}
		else if(temp_cs.CompareNoCase(Units_Type[UNITS_TYPE_CUSTOM])==0)
		{
			bac_ranges_type = VARIABLE_RANGE_CUSTOM_DIG_TYPE;
		}
	}
	cmp_ret = memcmp(&m_temp_variable_data[Changed_Item],&m_Variable_data.at(Changed_Item),sizeof(Str_variable_point));
	if(cmp_ret!=0)
	{
		m_variable_list.SetItemBkColor(Changed_Item,Changed_SubItem,LIST_ITEM_CHANGED_BKCOLOR);
	temp_task_info.Format(_T("Write Variable List Item%d .Changed to \"%s\" "),Changed_Item + 1,New_CString);
	Post_Write_Message(g_bac_instance,WRITEVARIABLE_T3000,Changed_Item,Changed_Item,sizeof(Str_variable_point),m_variable_dlg_hwnd ,temp_task_info,Changed_Item,Changed_SubItem);
	}
	return 0;
}
LRESULT CBacnetVariable::Fresh_Variable_List(WPARAM wParam,LPARAM lParam)
{

	int Fresh_Item;
	int isFreshOne = (int)lParam;
	if(isFreshOne == REFRESH_ON_ITEM)
	{
		Fresh_Item = (int)wParam;
	}
	else
	{
		if(m_variable_list.IsDataNewer((char *)&m_Variable_data.at(0),sizeof(Str_variable_point) * BAC_VARIABLE_ITEM_COUNT))
		{
			//避免list 刷新时闪烁;在没有数据变动的情况下不刷新List;
			m_variable_list.SetListData((char *)&m_Variable_data.at(0),sizeof(Str_variable_point) * BAC_VARIABLE_ITEM_COUNT);
		}
		else
		{
			return 0;
		}
	}


	for (int i=0;i<(int)m_Variable_data.size();i++)
	{
		CString temp_item,temp_value,temp_cal,temp_filter,temp_status,temp_lable;
		CString temp_des;
		CString temp_units;

		if(isFreshOne)
		{
			i = Fresh_Item;
		}

		MultiByteToWideChar( CP_ACP, 0, (char *)m_Variable_data.at(i).description, (int)strlen((char *)m_Variable_data.at(i).description)+1, 
			temp_des.GetBuffer(MAX_PATH), MAX_PATH );
		temp_des.ReleaseBuffer();
		m_variable_list.SetItemText(i,VARIABLE_FULL_LABLE,temp_des);
		if(m_Variable_data.at(i).auto_manual==0)
		{
			m_variable_list.SetItemText(i,VARIABLE_AUTO_MANUAL,_T("Auto"));
			m_variable_list.SetCellEnabled(i,VARIABLE_VALUE,0);
		}
		else
		{
			m_variable_list.SetItemText(i,VARIABLE_AUTO_MANUAL,_T("Manual"));
			m_variable_list.SetCellEnabled(i,VARIABLE_VALUE,1);
		}


		if(m_Variable_data.at(i).digital_analog == BAC_UNITS_DIGITAL)
		{
			

			if((m_Variable_data.at(i).range>22) || (m_Variable_data.at(i).range == 0))
			{
				m_variable_list.SetItemText(i,VARIABLE_UNITE,Digital_Units_Array[0]);
			}
			else
			{
				CString temp1;
				CStringArray temparray;
#if 0
				if(m_Variable_data.at(i).range>=12)
					temp1 = Digital_Units_Array[m_Variable_data.at(i).range - 11];//11 is the sizeof the array
				else
#endif
				temp1 = Digital_Units_Array[m_Variable_data.at(i).range];
				SplitCStringA(temparray,temp1,_T("/"));
				if((temparray.GetSize()==2))
				{
					if(m_Variable_data.at(i).control == 0)
						m_variable_list.SetItemText(i,VARIABLE_VALUE,temparray.GetAt(0));
					else
						m_variable_list.SetItemText(i,VARIABLE_VALUE,temparray.GetAt(1));
					m_variable_list.SetItemText(i,VARIABLE_UNITE,temp1);
				}
				
			}
#if 0
			m_variable_list.SetItemText(i,VARIABLE_UNITE,Digital_Units_Array[m_Variable_data.at(i).range]);	//单位 这个要商量 看要怎么搞;
			if((m_Variable_data.at(i).range >= 12)&&(m_Variable_data.at(i).range <= 22))
			{
				CString temp1;
				CStringArray temparray;
				temp1 = Digital_Units_Array[m_Variable_data.at(i).range - 11];//11 is the sizeof the array
				SplitCStringA(temparray,temp1,_T("/"));
				if((temparray.GetSize()==2)&&(!temparray.GetAt(1).IsEmpty()))
				{
					m_variable_list.SetItemText(i,VARIABLE_VALUE,temparray.GetAt(1));
				}
				m_variable_list.SetItemText(i,VARIABLE_UNITE,temp1);
			}
			else if((m_Variable_data.at(i).range >= 1)&&(m_Variable_data.at(i).range <= 11))
			{
				CString temp1;
				CStringArray temparray;
				temp1 = Digital_Units_Array[m_Variable_data.at(i).range];
				SplitCStringA(temparray,temp1,_T("/"));
				if((temparray.GetSize()==2)&&(!temparray.GetAt(0).IsEmpty()))
				{
					m_variable_list.SetItemText(i,VARIABLE_VALUE,temparray.GetAt(0));
				}
				m_variable_list.SetItemText(i,VARIABLE_UNITE,temp1);
			}
			else
			{
				m_variable_list.SetItemText(i,VARIABLE_VALUE,_T("0"));
			}
#endif
		}
		else
		{
			if(m_Variable_data.at(i).range == 20)	//如果是时间;
			{
				m_variable_list.SetItemText(i,VARIABLE_UNITE,Variable_Analog_Units_Array[m_Variable_data.at(i).range]);
				char temp_char[50];
				int time_seconds = m_Variable_data.at(i).value / 1000;
				intervaltotext(temp_char,time_seconds,0,0);
				CString temp_11;
				MultiByteToWideChar( CP_ACP, 0, temp_char, strlen(temp_char) + 1, 
					temp_11.GetBuffer(MAX_PATH), MAX_PATH );
				temp_11.ReleaseBuffer();		
				m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_11);

				//temp_value.Format(_T("%d"),m_Variable_data.at(i).value);
				//m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_value);
			}
			else if(m_Variable_data.at(i).range<=sizeof(Variable_Analog_Units_Array)/sizeof(Variable_Analog_Units_Array[0]))
			{
			m_variable_list.SetItemText(i,VARIABLE_UNITE,Variable_Analog_Units_Array[m_Variable_data.at(i).range]);

			CString cstemp_value;
			float temp_float_value;
			temp_float_value = ((float)m_Variable_data.at(i).value) / 1000;
			cstemp_value.Format(_T("%.3f"),temp_float_value);
			m_variable_list.SetItemText(i,VARIABLE_VALUE,cstemp_value);

			//temp_value.Format(_T("%d"),m_Variable_data.at(i).value);
			//m_variable_list.SetItemText(i,VARIABLE_VALUE,temp_value);
			}
		}
		
		CString temp_des2;
		MultiByteToWideChar( CP_ACP, 0, (char *)m_Variable_data.at(i).label, (int)strlen((char *)m_Variable_data.at(i).label)+1, 
			temp_des2.GetBuffer(MAX_PATH), MAX_PATH );
		temp_des2.ReleaseBuffer();
		m_variable_list.SetItemText(i,VARIABLE_LABLE,temp_des2);


		if(isFreshOne)
		{
			break;
		}

	}
	copy_data_to_ptrpanel(TYPE_VARIABLE);
	//MessageBox("1");
	return 0;
}
void CBacnetVariable::OnNMClickListVariable(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: Add your control notification handler code here
    long lRow,lCol;
    m_variable_list.Set_Edit(true);
    DWORD dwPos=GetMessagePos();//Get which line is click by user.Set the check box, when user enter Insert it will jump to program dialog
    CPoint point( LOWORD(dwPos), HIWORD(dwPos));
    m_variable_list.ScreenToClient(&point);
    LVHITTESTINFO lvinfo;
    lvinfo.pt=point;
    lvinfo.flags=LVHT_ABOVE;
    int nItem=m_variable_list.SubItemHitTest(&lvinfo);

    lRow = lvinfo.iItem;
    lCol = lvinfo.iSubItem;


    if(lRow>m_variable_list.GetItemCount()) //如果点击区超过最大行号,则点击是无效的
        return;
    if(lRow<0)
        return;



    CString temp1;
    m_row = lRow;
    m_col = lCol;

    memcpy_s(&m_temp_variable_data[lRow],sizeof(Str_variable_point),&m_Variable_data.at(lRow),sizeof(Str_variable_point));
    CString New_CString;
    CString temp_task_info;
    if((lCol == VARIABLE_VALUE) &&(m_Variable_data.at(lRow).digital_analog == BAC_UNITS_DIGITAL ) && (m_Variable_data.at(lRow).auto_manual != BAC_AUTO))
    {


        CString temp1;
        CStringArray temparray;

        if((m_Variable_data.at(lRow).range < 23) &&(m_Variable_data.at(lRow).range !=0))
            temp1 = Digital_Units_Array[m_Variable_data.at(lRow).range];
        else if((m_Variable_data.at(lRow).range >=23) && (m_Variable_data.at(lRow).range <= 30))
        {
            if(receive_customer_unit)
                temp1 = temp_unit_no_index[m_Variable_data.at(lRow).range - 23];
            else
            {
                m_variable_list.Set_Edit(false);
                return;
            }
        }
        else
            return;
        SplitCStringA(temparray,temp1,_T("/"));



        if(m_Variable_data.at(lRow).control == 0)
        {
            m_Variable_data.at(lRow).control = 1;
            m_variable_list.SetItemText(lRow,VARIABLE_VALUE,temparray.GetAt(1));
            New_CString = temparray.GetAt(1);
        }
        else
        {
            m_Variable_data.at(lRow).control = 0;
            m_variable_list.SetItemText(lRow,VARIABLE_VALUE,temparray.GetAt(0));
            New_CString = temparray.GetAt(0);
        }
        m_variable_list.Set_Edit(false);

        temp_task_info.Format(_T("Write Variable List Item%d .Changed to \"%s\" "),lRow + 1,New_CString);
    }
    else if((lCol == VARIABLE_VALUE) &&(m_Variable_data.at(lRow).digital_analog == BAC_UNITS_ANALOG ) && (m_Variable_data.at(lRow).auto_manual == BAC_MANUAL) && (m_Variable_data.at(lRow).range == 20))
    {
        m_variable_list.Set_Edit(false);
        m_variable_time_picker.ShowWindow(SW_SHOW);
        CRect list_rect,win_rect;
        m_variable_list.GetWindowRect(list_rect);
        GetWindowRect(win_rect);
        CRect myrect;
        m_variable_list.GetSubItemRect(lRow,lCol,LVIR_BOUNDS,myrect);


        myrect.left = myrect.left + list_rect.left - win_rect.left  +2 ;
        myrect.right = myrect.right + list_rect.left - win_rect.left + 2;
        //myrect.top = myrect.top + 11;
        //myrect.bottom = myrect.bottom + 13;
        myrect.top = myrect.top + 24;
        myrect.bottom = myrect.bottom + 26;
        m_variable_time_picker.BringWindowToTop();
        m_variable_time_picker.MoveWindow(myrect);


        CString Temp_CString =  m_variable_list.GetItemText(lRow,lCol);

        CStringArray TEMPCS;
        int temp_hour,temp_minute;
        SplitCStringA(TEMPCS, Temp_CString, _T(":"));
        if((int)TEMPCS.GetSize() <2)
        {
            temp_hour = 0;
            temp_minute = 0;
            CTime TimeTemp(2014,1,1,temp_hour,temp_minute,0);
            m_variable_time_picker.SetFormat(_T("HH:mm"));
            m_variable_time_picker.SetTime(&TimeTemp);
            m_variable_time_picker.SetFocus();
        }
        else
        {
            temp_hour = _wtoi(TEMPCS.GetAt(0));
            temp_minute = _wtoi(TEMPCS.GetAt(1));
            CTime TimeTemp(2014,1,1,temp_hour,temp_minute,0);
            m_variable_time_picker.SetFormat(_T("HH:mm"));
            m_variable_time_picker.SetTime(&TimeTemp);
            m_variable_time_picker.SetFocus();
        }
        m_variable_list.SetItemText(lRow,lCol,_T(""));
        m_variable_time_picker.Invalidate();
        SetTimer(2,100,NULL);
    }
    else if(lCol == VARIABLE_VALUE)
    {
        if(m_Variable_data.at(lRow).auto_manual == BAC_AUTO)
        {
            m_variable_list.Set_Edit(false);
            return;
        }
    }
    else if(lCol == VARIABLE_AUTO_MANUAL)
    {
        if(m_Variable_data.at(lRow).auto_manual == 0)
        {
            m_Variable_data.at(lRow).auto_manual = 1;
            m_variable_list.SetItemText(lRow,VARIABLE_AUTO_MANUAL,_T("Manual"));
            //m_variable_list.SetCellEnabled(lRow,VARIABLE_VALUE,TRUE);
            New_CString = _T("Manual");
        }
        else
        {
            m_Variable_data.at(lRow).auto_manual = 0;
            m_variable_list.SetItemText(lRow,VARIABLE_AUTO_MANUAL,_T("Auto"));
            //m_variable_list.SetCellEnabled(lRow,VARIABLE_VALUE,FALSE);
            New_CString = _T("Auto");
        }
        temp_task_info.Format(_T("Write Variable List Item%d .Changed to \"%s\" "),lRow + 1,New_CString);
    }
    else if(lCol == VARIABLE_UNITE)
    {


        BacnetRange dlg;

        //点击产品的时候 需要读customer units,老的产品firmware 说不定没有 这些,所以不强迫要读到;
        if(!read_customer_unit)
        {

            int temp_invoke_id = -1;
            int send_status = true;
            int	resend_count = 0;
            for (int z=0; z<3; z++)
            {
                do
                {
                    resend_count ++;
                    if(resend_count>5)
                    {
                        send_status = false;
                        break;
                    }
                    temp_invoke_id =  GetPrivateData(
                                          g_bac_instance,
                                          READUNIT_T3000,
                                          0,
                                          BAC_CUSTOMER_UNITS_COUNT - 1,
                                          sizeof(Str_Units_element));

                    Sleep(SEND_COMMAND_DELAY_TIME);
                } while (g_invoke_id<0);
                if(send_status)
                {
                    for (int z=0; z<1000; z++)
                    {
                        Sleep(1);
                        if(tsm_invoke_id_free(temp_invoke_id))
                        {
                            read_customer_unit = true;
                            break;
                        }
                        else
                            continue;
                    }

                }
                if(read_customer_unit)
                    break;
            }

        }

        //CString temp_cs = m_variable_list.GetItemText(lRow,lCol);
        //if(temp_cs.CompareNoCase(Units_Type[UNITS_TYPE_ANALOG])==0)
        //{


        if(m_Variable_data.at(lRow).digital_analog == BAC_UNITS_ANALOG)
        {
            bac_ranges_type = VARIABLE_RANGE_ANALOG_TYPE;
            if(m_Variable_data.at(lRow).range > (sizeof(Variable_Analog_Units_Array) / sizeof(Variable_Analog_Units_Array[0])))
            {
                m_Variable_data.at(lRow).range = 0;
                bac_range_number_choose = 0;
            }
        }
        else
        {
            bac_ranges_type = VARIABLE_RANGE_DIGITAL_TYPE;
            if(m_Variable_data.at(lRow).range > 30)
            {
                m_Variable_data.at(lRow).range = 0;
                bac_range_number_choose = 0;
            }
        }


        initial_dialog = 1;
        bac_range_number_choose = m_Variable_data.at(lRow).range;
        //bac_ranges_type = VARIABLE_RANGE_ANALOG_TYPE;
        dlg.DoModal();
        if(range_cancel)
        {
            PostMessage(WM_REFRESH_BAC_VARIABLE_LIST,lRow,REFRESH_ON_ITEM);//这里调用 刷新线程重新刷新会方便一点;
            return ;
        }
        if(bac_range_number_choose == 0)	//如果选择的是 unused 就认为是analog 的unused;这样 能显示对应的value;
        {
            m_Variable_data.at(lRow).digital_analog =  BAC_UNITS_ANALOG;
            bac_ranges_type = VARIABLE_RANGE_ANALOG_TYPE;
        }

        if(bac_ranges_type == VARIABLE_RANGE_ANALOG_TYPE)
        {
            m_Variable_data.at(lRow).digital_analog = BAC_UNITS_ANALOG;
            m_Variable_data.at(lRow).range = bac_range_number_choose;
            m_variable_list.SetItemText(lRow,lCol,Variable_Analog_Units_Array[bac_range_number_choose]);



            if(m_Variable_data.at(lRow).range == 20)	//如果是时间;
            {
                char temp_char[50];
                int time_seconds = m_Variable_data.at(lRow).value / 1000;
                intervaltotext(temp_char,time_seconds,0,0);

                CString temp_11;
                MultiByteToWideChar( CP_ACP, 0, temp_char, strlen(temp_char) + 1,
                                     temp_11.GetBuffer(MAX_PATH), MAX_PATH );
                temp_11.ReleaseBuffer();
                m_variable_list.SetItemText(lRow,VARIABLE_VALUE,temp_11);

            }
            else
            {
                CString cstemp_value;
                float temp_float_value;
                temp_float_value = ((float)m_Variable_data.at(lRow).value) / 1000;
                cstemp_value.Format(_T("%.3f"),temp_float_value);
                m_variable_list.SetItemText(lRow,VARIABLE_VALUE,cstemp_value);

                /*				cstemp_value.Format(_T("%d"),m_Variable_data.at(Changed_Item).value);
                m_variable_list.SetItemText(Changed_Item,VARIABLE_VALUE,cstemp_value);*/
            }
        }
        else if((bac_ranges_type == VARIABLE_RANGE_DIGITAL_TYPE) || (bac_ranges_type == INPUT_RANGE_DIGITAL_TYPE) || (bac_ranges_type == OUTPUT_RANGE_DIGITAL_TYPE))
        {
            m_Variable_data.at(lRow).digital_analog = BAC_UNITS_DIGITAL;
            m_Variable_data.at(lRow).range = bac_range_number_choose;


            CStringArray temparray;
            if((bac_range_number_choose >= 23) && (bac_range_number_choose <= 30))
            {
                //temp1.Format(_T("%s"), temp_unit_no_index[bac_range_number_choose - 23]);
                temp1 = temp_unit_no_index[bac_range_number_choose - 23];
            }
            else
                temp1 = Digital_Units_Array[bac_range_number_choose];//22 is the sizeof the array

            SplitCStringA(temparray,temp1,_T("/"));





            if(m_Variable_data.at(lRow).control == 1)
            {
                if((temparray.GetSize()==2)&&(!temparray.GetAt(1).IsEmpty()))
                {
                    m_variable_list.SetItemText(lRow,VARIABLE_VALUE,temparray.GetAt(1));
                }
            }
            else
            {
                if((temparray.GetSize()==2)&&(!temparray.GetAt(0).IsEmpty()))
                {
                    m_variable_list.SetItemText(lRow,VARIABLE_VALUE,temparray.GetAt(0));
                }
            }
            m_variable_list.SetItemText(lRow,VARIABLE_UNITE,temp1);
        }


    }
    else
    {
        //m_variable_list.Set_Edit(false);
        return;
    }

    int cmp_ret = memcmp(&m_temp_variable_data[lRow],&m_Variable_data.at(lRow),sizeof(Str_variable_point));
    if(cmp_ret!=0)
    {
        m_variable_list.SetItemBkColor(lRow,lCol,LIST_ITEM_CHANGED_BKCOLOR);
        Post_Write_Message(g_bac_instance,WRITEVARIABLE_T3000,lRow,lRow,sizeof(Str_variable_point),m_variable_dlg_hwnd,temp_task_info,lRow,lCol);
    }
//	GetDlgItem(IDC_BUTTON_VARIABLE_APPLY)->SetFocus();
    *pResult = 0;
}
int GetVariableValue(int index ,CString &ret_cstring,CString &ret_unit,CString &Auto_M,int &digital_value)
{
    CStringArray temparray;
    CString temp1;
    if(index >= BAC_VARIABLE_ITEM_COUNT)
    {
        ret_cstring.Empty();
        ret_unit.Empty();
        Auto_M.Empty();
        return -1;
    }
    int i = index;

    if(m_Variable_data.at(i).auto_manual == 1)
    {
        Auto_M = _T("M");
    }
    else
    {
        Auto_M.Empty();
    }

    if(m_Variable_data.at(i).digital_analog == BAC_UNITS_DIGITAL)
    {
        if(m_Variable_data.at(i).range>30)
        {
            ret_cstring.Empty();
            return -1;
        }
        else
        {
            if((m_Variable_data.at(i).range < 23) &&(m_Variable_data.at(i).range !=0))
                temp1 = Digital_Units_Array[m_Variable_data.at(i).range];
            else if((m_Variable_data.at(i).range >=23) && (m_Variable_data.at(i).range <= 30))
            {
                if(receive_customer_unit)
                    temp1 = temp_unit_no_index[m_Variable_data.at(i).range - 23];
            }
            else
            {
                ret_cstring.Empty();
                return -1;
            }


            SplitCStringA(temparray,temp1,_T("/"));
            if((temparray.GetSize()==2))
            {
                if(m_Variable_data.at(i).control == 0)
                {
                    digital_value = 0;
                    ret_cstring = temparray.GetAt(0);
                    return 1;
                }
                else
                {
                    digital_value = 1;
                    ret_cstring = temparray.GetAt(1);
                }
            }

        }
    }
    else
    {
        if(m_Variable_data.at(i).range == 20)	//如果是时间;
        {
            ret_unit = Variable_Analog_Units_Array[m_Variable_data.at(i).range];
            char temp_char[50];
            int time_seconds = m_Variable_data.at(i).value / 1000;
            intervaltotext(temp_char,time_seconds,0,0);

            MultiByteToWideChar( CP_ACP, 0, temp_char, strlen(temp_char) + 1,
                                 ret_cstring.GetBuffer(MAX_PATH), MAX_PATH );
            ret_cstring.ReleaseBuffer();
            digital_value = 2;
        }
        else if((m_Variable_data.at(i).range<=sizeof(Variable_Analog_Units_Array)/sizeof(Variable_Analog_Units_Array[0])) && (m_Variable_data.at(i).range != 0))
        {
            ret_unit = Variable_Analog_Units_Array[m_Variable_data.at(i).range];
            CString cstemp_value;
            float temp_float_value;
            temp_float_value = ((float)m_Variable_data.at(i).value) / 1000;
            ret_cstring.Format(_T("%.3f"),temp_float_value);
            digital_value = 2;
        }
        else
        {
            ret_cstring.Empty();
            return -1;
        }
    }

    return 1;
}