jglee преди 3 години
родител
ревизия
660aba96b2
променени са 30 файла, в които са добавени 3423 реда и са изтрити 0 реда
  1. 3423 0
      WallPadHomeCtrl/src/main/java/kr/co/icontrols/wallpadhomectrl/screen/screen_venti/VentilationModelMainScreen.java
  2. BIN
      WallPadHomeCtrl/src/main/res/drawable-ldpi/bg_concent_popup_odd.png
  3. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_inqu_pressed.png
  4. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_disabled.png
  5. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_normal.png
  6. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_pressed.png
  7. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_disabled.png
  8. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_normal.png
  9. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_pressed.png
  10. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_1.png
  11. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_2.png
  12. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_3.png
  13. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_4.png
  14. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_1.png
  15. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_2.png
  16. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_3.png
  17. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_4.png
  18. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_press.png
  19. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_1.png
  20. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_2.png
  21. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_3.png
  22. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/venti_sanitiztion_bg_status.png
  23. BIN
      WallPadHomeCtrl/src/main/res/drawable-mdpi/venti_sanitiztion_bg_status_off.png
  24. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_blank.png
  25. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_purple_normal.png
  26. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_purple_pressed.png
  27. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_red_normal.png
  28. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_red_pressed.png
  29. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_skyblue_normal.png
  30. BIN
      WallPadMain/src/main/res/drawable-ldpi/btn_skyblue_pressed.png

+ 3423 - 0
WallPadHomeCtrl/src/main/java/kr/co/icontrols/wallpadhomectrl/screen/screen_venti/VentilationModelMainScreen.java

@@ -0,0 +1,3423 @@
+/*
+ * Copyright (C) 2018 Android WallPad Project
+ *
+ * FileName  : HeatingV2PopupScreen.java
+ * Project   : Android WallPad Project
+ * Company   : HDC I-CONTROLS ( www.icontrols.co.kr )
+ * Author    : Choi In Bo  , inbo207@icontrols.co.kr
+ */
+
+
+package kr.co.icontrols.wallpadhomectrl.screen.screen_venti;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+import com.artncore.WallPadDataMgr.WallpadDeviceSet;
+import com.artncore.WallPadDataMgr.WallpadStatusData;
+import com.artncore.commons.API_Menu;
+import com.artncore.commons.DataClasses.AirQualityData;
+import com.artncore.commons.DataClasses.AirQualityData.Device.AIRLevel;
+import com.artncore.commons.DataClasses.Venti;
+import com.artncore.wallpadapi.AirQualitySensorAPI;
+import com.artncore.wallpadapi.VentiAPI;
+import com.artncore.wallpadapi.WallPadAPI;
+import com.artncore.wallpadapi.WallPadDevAPI;
+import com.util.LogUtil;
+
+import kr.co.icontrols.wallpadhomectrl.MainActivity;
+import kr.co.icontrols.wallpadhomectrl.R;
+import kr.co.icontrols.wallpadhomectrl.declare.Common;
+import kr.co.icontrols.wallpadhomectrl.declare.ID;
+import kr.co.icontrols.wallpadhomectrl.declare.TransactionDisplay;
+import kr.co.icontrols.wallpadhomectrl.screen.screen_heating.HeatingV2MainScreen;
+import kr.co.icontrols.wallpadsupport.Version;
+import kr.co.icontrols.wallpadsupport.WpadImageView;
+import kr.co.icontrols.wallpadsupport.WpadImageView.TOUCH_KIND;
+import kr.co.icontrols.wallpadsupport.WpadScreen;
+import kr.co.icontrols.wallpadsupport.WpadSound.SND;
+import kr.co.icontrols.wallpadsupport.WpadTextView;
+
+import static kr.co.icontrols.wallpadhomectrl.screen.screen_venti.VentilationModelMainScreen.Mode.NormalMode;
+
+
+/**
+ * @description
+ * 월패드 [우리집제어->환기] 메인화면 이다.<br>
+ * 예약버튼, ON/OFF버튼, 약풍/미풍,강풍 풍량버튼, 타이머좌우 버튼<br>
+ * 을(를) 여기서 처리한다.
+ */
+@SuppressLint("ViewConstructor")
+public class VentilationModelMainScreen extends WpadScreen {
+	private final String TAG = "VentilationMainScreen";
+
+	private final boolean DEBUG_LOG_ON = true;
+	private void printDebugLog(String s) { if(DEBUG_LOG_ON) Log.d(TAG, s); }
+
+	// =================================================================================================
+	// [[ Declaration ]] region
+	// =================================================================================================
+	// [Image]
+	private WpadImageView IMG_BACKGROUND;
+	private WpadImageView IMG_BACK_HOUSE;
+	private WpadImageView IMG_VENTIL_ANIM, IMG_FILTER_CHANGE, IMG_CARE_SERVICE;
+	private WpadImageView IMG_SANITIZATION_STATUS;
+
+	//private WpadImageView WindTitle;
+	//private WpadImageView TimerTitle, TimerBlank;
+	//private WpadImageView ByPassTitle;
+	//private WpadImageView HeaterTitle;
+	//private WpadImageView AutoDrivingTitle;
+	//private WpadImageView BathRoomTitle;
+
+	private WpadImageView IMG_AIRQUALITY_STATUS_PM10;   // 미세먼지 상태 이미지
+	private WpadImageView IMG_AIRQUALITY_STATUS_PM2p5;   // 초미세먼지 상태 이미지
+	private WpadImageView IMG_AIRQUALITY_STATUS_CO2;   // 이산화탄소 상태 이미지
+	private WpadImageView IMG_BRIGHTNESS_STATUS;   // 미세먼지 상태 이미지
+
+	// [Button]
+	private WpadImageView BTN_ONOFF_POWER, BTN_ONOFF_AUTOCLEAN, BTN_ONOFF_RESERVATION, BTN_RESERVATION_CONFIG, BTN_ONOFF_HEATER, BTN_BATHROOM;
+	private WpadImageView BTN_VENTILMODE_NORMAL, BTN_VENTILMODE_NATURAL, BTN_VENTILMODE_INTERNALCIRCUL, BTN_VENTILMODE_EXTERNALAIRCLEAN, BTN_VENTILMODE_SLEEP, BTN_VENTILMODE_AUTO;
+	private WpadImageView BTN_WIND_01, BTN_WIND_02, BTN_WIND_03;
+	private WpadImageView BTN_TIMER_LEFT, BTN_TIMER_RIGHT;
+	private WpadImageView BTN_ONOFF_CONFIG, BTN_SANITIZATION, BTN_BRIGHTNESS, BTN_ONOFF_SANITIZATION, BTN_ONOFF_VANITIZATION;
+
+	private WpadImageView BTN_PAGE_UP;
+	private WpadImageView BTN_PAGE_DOWN;
+
+	// [Text]
+	private WpadTextView TXT_TITLE_ONOFF_POWER, TXT_TITLE_ONOFF_AUTOCLEAN, TXT_TITLE_ONOFF_AUTO, TXT_TITLE_ONOFF_RESERVATION, TXT_TITLE_ONOFF_HEATER, TXT_TITLE_MODE, TXT_TITLE_WIND, TXT_TITLE_TIMER, TXT_TITLE_SANITIZATION, TXT_TITLE_VENTILATION, TXT_TITLE_BRIGHTNESS;
+
+	private WpadTextView TXT_TIMER;
+	private WpadTextView TXT_BATHROOM;
+	private WpadTextView TXT_ALARM_MESSAGE;
+
+	private WpadTextView TXT_AIRQUALITY_TITLE_PM10;
+	private WpadTextView TXT_AIRQUALITY_TITLE_PM2p5;
+	private WpadTextView TXT_AIRQUALITY_TITLE_CO2;
+	private WpadTextView TXT_AIRQUALITY_STATUS_PM10;
+	private WpadTextView TXT_AIRQUALITY_STATUS_PM2p5;
+	private WpadTextView TXT_AIRQUALITY_STATUS_CO2;
+	private WpadTextView TXT_AIRQUALITY_FIGURE_PM10;
+	private WpadTextView TXT_AIRQUALITY_FIGURE_PM2p5;
+	private WpadTextView TXT_AIRQUALITY_FIGURE_CO2;
+
+	private WpadTextView TXT_INSTRUCTION;
+
+	int FONT_SIZE_TITLE_NORMAL = Common.fontsize._30;
+	int FONT_SIZE_TITLE_AIRQUALITY = Common.fontsize._24;
+
+	// [Variables]
+	private int OPERATION_MODE = -1;
+	private boolean TEST_BUTTON = false; // 외기청정, 내부순환 테스트용 버튼 임시생성 / 자연,자동,취침 임시용
+	private boolean SAMPLE_MODE_TEST = false; // 샘플모드 플래그 (테스트용)
+
+	private boolean bEasyModeUse = false;
+
+	private int mVentilAnimImgCnt = 0;
+	private Handler mVentilAnimHandler = null;
+	private Handler mFilterChangeHandler = null;
+	private boolean mFilterChangeHandlerRun = false;
+
+	private byte hVentilAnimStatus = 0;
+	private int[] mVentilAnim = null;
+
+	// 일반환기 애니메이션
+	private int[] mAnimModeNormal = new int[] { R.drawable.ctrl_ventil_anim_normal_01, R.drawable.ctrl_ventil_anim_normal_02 };
+	// 자연환기 애니메이션
+	private int[] mAnimModeNatural = new int[]{ R.drawable.ctrl_ventil_anim_natural_01, R.drawable.ctrl_ventil_anim_natural_02 };
+	// 내부순환 애니메이션
+	private int[] mAnimModeInternalCircul = new int[]{ R.drawable.ctrl_ventil_anim_internal_01, R.drawable.ctrl_ventil_anim_internal_02 };
+	// 외기청정 애니메이션
+	private int[] mAnimModeExternalClean = new int[]{ R.drawable.ctrl_ventil_anim_externalclean_01, R.drawable.ctrl_ventil_anim_externalclean_02 };
+
+	private class VentilData {
+		Venti VentilStatus;
+		int Type;   // 현산,LH,후드
+		int[] TimerTable;
+		public VentilData(int nType) {
+			VentilStatus = new Venti();
+			Type = nType;
+			if (Type == API_Menu.SubMenuCtrl.ChangAir_LH) TimerTable = new int [] { 0, 30 , 60 , 90 };
+			else TimerTable = new int [] { 0, 10 , 20 , 30 , 60 , 120 , 180 , 240 };
+		}
+	}
+
+	private VentilData mVentilData;
+	public String strVentilManual = ""; // ByPass:0/Heater:0
+
+	private AirQualityData mAirQualityData;
+	private boolean bAirQualityFigureSupport = false;
+
+	// [API]
+	//private VentiAPI mVentilAPI = null;
+	private AirQualitySensorAPI mAirQualitySensorAPI;
+	private TransactionDisplay mTransactionDisplay = null;
+
+	boolean bVentilCareService = false;   // 환기케어서비스 여부
+	boolean bDisplayAirQuality = false;   // 실내 공기질 상태 표시 여부
+	boolean bAirQualitySensorUsage = false;   // 실내 공기질 센서 사용 여부
+	boolean bVentilSupportAutoClean = false;   // 환기장비 자동청정 기능 지원 여부 (내부순환, 외기청정 지원 여부)
+
+	public static boolean bFilterChange = false; // 필터교체 알림 버튼 Visible 유뮤 (매뉴얼 화면에서 버튼 유무를 파악하기 위함)
+
+	//Control을 위한 변수
+	protected boolean OnOff = false;
+	protected boolean Reservation = false;
+	byte Wind = 0x01;
+	protected boolean ByPass = false;
+	protected boolean AutoDriving = false;
+	protected boolean BathRoom = false;
+	protected boolean InnerCycle = false;
+	protected boolean OutAirClean = false;
+	protected boolean AirCleanAuto = false;
+	protected boolean HDCAutoAirClean = false;
+	byte Sleep = 0x00;
+	byte HeaterStatus = Venti.HEATER.NOT_SUPPORT;
+	int HeaterTimeRemaining = 0;
+	byte EtcCtr = 0x00;
+	int Timer = 0;
+	Venti.FAULT Fault = new Venti.FAULT((byte)0x00);
+	Venti.SUPPORT Support = new Venti.SUPPORT((byte)0xFB);
+	Venti.SUPPORT2 Support2 = new Venti.SUPPORT2((byte)0xF);
+
+	protected boolean sanitiztion = false;
+	protected boolean room_vanti = false;
+
+
+	private RoomView[] roomView = null;
+
+
+	int nRoomCnt = 4; //거실, 안방, 방1, 방2
+
+	public enum Mode
+	{
+		NormalMode, ByPassMode, InnerCycleMode, OutAirCleanMode
+	}
+
+	/**
+	 * 공기 모드 변경
+	 * @param Mode 0: 기본, 1 : 바이패스, 2: 내분순환(공기청정), 3: 외기청정(공기청정 + 외기흡기)
+	 */
+	protected void SetMode(Mode _mode)
+	{
+		ByPass = false;
+		InnerCycle = false;
+		OutAirClean = false;
+
+		switch (_mode)
+		{
+			case NormalMode:
+				break;
+			case ByPassMode:
+				ByPass = true;
+				break;
+			case InnerCycleMode:
+				InnerCycle = true;
+				break;
+			case OutAirCleanMode:
+				OutAirClean = true;
+				break;
+			default:
+				break;
+		}
+	}
+
+
+	// [Package]
+	/**
+	 * 개별방의 View 구조를 정의한다.
+	 */
+	private class RoomView {
+
+		public WpadTextView TXT_TITLE;          // 방표시 버튼
+		public WpadImageView BTN_ONOFF;          // 운전모드 ON/OFF 버튼
+
+		boolean OnOff = false;
+
+		public boolean getOnOff(){return OnOff;}
+
+		/**
+		 * 생성자
+		 * @param left  - (int) 좌측마진
+		 * @param top   - (int) 상측마진
+		 * @param index - (int) 인덱스
+		 * 현재 버전 기준은 4개 기준 무조건
+		 */
+		private RoomView(int left, int top, int _index) {
+			// 룸뷰 배경 그리기
+			int w = 98;
+			int h = 54;
+
+			int mNormal;
+			int mPress = R.drawable.btn_venti_room_press;
+			String room_name = "";
+
+			Log.d(TAG, "**************************룸뷰 생성 : " + _index);
+			//this.index = index;
+			switch (_index)
+			{
+				case 0:
+					mNormal =  R.drawable.btn_venti_room_off_lv_1;
+					room_name = "거실";
+					break;
+				case 1:
+					mNormal = R.drawable.btn_venti_room_off_lv_4;
+					room_name = "안방";
+					break;
+				case 2:
+					mNormal = R.drawable.btn_venti_room_off_lv_3;
+					room_name = "방1";
+					break;
+				case 3:
+					mNormal = R.drawable.btn_venti_room_off_lv_2;
+					room_name = "방2";
+					break;
+				default:
+					mNormal = R.drawable.btn_venti_room_off_lv_1;
+					room_name = "거실";
+					break;
+			}
+
+
+
+			BTN_ONOFF = new WpadImageView(getContext(), TOUCH_KIND.BUTTON, 98, 54, mNormal, mPress, ID.VentilationMainScreenID.BTN.ROOM_ONOFF_1 + _index);
+			//ViewRegistration(getLayout(), OnOffBtn, left+119, top+67);
+			ViewRegistration(getLayout(), BTN_ONOFF, Common.ImgPosion.GetX(left), Common.ImgPosion.GetY(top));
+			BTN_ONOFF.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL);
+			int[] mTitleFontSize = {Common.fontsize._35, Common.fontsize._44};
+			TXT_TITLE = new WpadTextView(getContext(), false, 98, 30, Gravity.CENTER, Color.WHITE, 24, true, ID.VentilationMainScreenID.TXT.ROOM_TITLE_1 + _index);
+			//ViewRegistration(getLayout(), TitleText, left+10, top+10);
+			ViewRegistration(getLayout(), TXT_TITLE, Common.ImgPosion.GetX(left), Common.ImgPosion.GetY(top+14));
+			TXT_TITLE.setText(room_name);
+
+
+
+		}
+
+		public void setEnable(boolean enable) {
+
+		}
+
+		public void setStatus(boolean OnOff, int Status) {
+			setEnable(true);
+			Log.d(TAG, "**************************" + TXT_TITLE.getText().toString() + ", OnOff : " + OnOff +", Status : " + Status);
+			if(OnOff)
+			{
+				switch (Status)
+				{
+					case 0:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 파랑 거실" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_on_lv_1);
+						break;
+					case 1:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 초록 안방" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_on_lv_2);
+						break;
+					case 2:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 노랑 방1" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_on_lv_3);
+						break;
+					case 3:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 빨강 방2" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_on_lv_4);
+						break;
+					default:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : " + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_on_lv_1);
+						break;
+				}
+			}
+			else
+			{
+//				Message msg = OffHandler.obtainMessage();
+//				msg.what = index;
+//				msg.arg1 = Status;
+//				OffHandler.sendMessage(msg);
+				switch (Status)
+				{
+					case 0:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 파랑 거실" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_off_lv_1);
+						break;
+					case 1:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 초록 안방" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_off_lv_2);
+						break;
+					case 2:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 노랑 방1" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_off_lv_3);
+						break;
+					case 3:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : 빨강 방2" + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_off_lv_4);
+						break;
+					default:
+						Log.d(TAG, "**************************OnOff : " + OnOff +", Status : " + Status);
+						BTN_ONOFF.setImageResource(R.drawable.btn_venti_room_off_lv_1);
+						break;
+				}
+			}
+
+			this.OnOff = !OnOff;
+		}
+	}
+
+
+	private  int [][][] mRoomPos = new int [][][]
+			{
+					{ {750, 504}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0} },                         // 1개(가이드 좌표 X - 임의 설정)
+					{ {750, 504}, {853, 504}, {0, 0}, {0, 0}, {0, 0}, {0, 0} },                     // 2개(가이드 좌표 X - 임의 설정)
+					{ {750, 504}, {853, 504}, {956, 504}, {0, 0}, {0, 0}, {0, 0} },                 // 3개(가이드 좌표 O)
+					{ {750, 504}, {853, 504}, {956, 504}, {1059, 504}, {0, 0}, {0, 0} },             // 4개(가이드 좌표 O)
+					{ {70, 168}, {359, 168}, {648, 168}, {200, 462}, {489, 462}, {0, 0}},            // 5개(가이드 좌표 O)
+					{ {70, 168}, {359, 168}, {648, 168}, {70, 462}, {359, 462}, {648, 462} },       // 6개(가이드 좌표 O)
+					{ {70, 110}, {359, 110}, {648, 110}, {70, 404}, {359, 404}, {648, 404}, {345, 328} },                  // 7개
+					{ {70, 110}, {359, 110}, {648, 110}, {70, 404}, {359, 404}, {648, 404}, {200, 328}, {489, 328}},       // 8개
+					{ {70, 110}, {359, 110}, {648, 110}, {70, 404}, {359, 404}, {648, 404}, {50, 328}, {339, 328}, {628, 328}} // 9개
+			};
+
+
+
+	// =================================================================================================
+	// [[ Create & Close ]] region
+	// =================================================================================================
+	/**
+	 * VentiMainScreen 클래스 생성자
+	 *
+	 * @param context       - 부모 context
+	 * @param layout        - 사용할 main layout
+	 * @param wpapi         - 상속받은 WallPadAPI
+	 * @param operationMode - 동작모드
+	 * @param nMenuId       - APP 시작시 메인에서 전달받은 MunuID (본 값으로 하여 [기본], [후드], [LH] 상태를 변경한다)
+	 */
+	@SuppressLint("HandlerLeak")
+	public VentilationModelMainScreen(Context context, RelativeLayout layout, WallPadAPI wpapi, int operationMode, int nMenuId) {
+		super(context, layout);
+
+		Log.i(TAG, "[START - Screen] --------------------------------------------");
+
+		// 1. Data Create
+		printDebugLog("[Create] - Step1 : Data Create");
+		OPERATION_MODE = operationMode;
+		mVentilAnim = mAnimModeNormal;
+		Log.i(TAG, "[START - Screen] nMenuId: " + nMenuId);
+		mVentilData = new VentilData(nMenuId);
+		mAirQualityData = new AirQualityData();
+
+		bEasyModeUse = ((MainActivity) context).GetEasyModeUXUse();
+		bAirQualitySensorUsage = ((MainActivity) context).getAirSensorAPUsage();
+		WallpadDeviceSet mWallpadDeviceSet = new WallpadDeviceSet(getContext());
+		bVentilCareService = mWallpadDeviceSet.Get_VentiServiceQRUse();
+		mWallpadDeviceSet.closeDB();
+
+		// 2. Device API Load & Update
+		printDebugLog("[Create] - Step2 : Device API Load & Update");
+		if (OPERATION_MODE == Common.MODE_NOMAL) {
+			printDebugLog("OPERATION_MODE = MODE_NOMAL");
+			updateVentilatorData(false);
+			if (bAirQualitySensorUsage) {
+				if (loadAirSensorAPI(wpapi) >= 0) updateAirSensorData(false);
+			}
+		}
+		else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+			printDebugLog("OPERATION_MODE = MODE_BUSINESS_SAMPLE");
+		}
+		else {
+			printDebugLog("OPERATION_MODE = Other (" + OPERATION_MODE + " ... Change Mode -> MODE_NOMAL");
+			OPERATION_MODE = Common.MODE_NOMAL;
+		}
+
+		roomView = new RoomView[nRoomCnt];
+		for(int i = 0 ; i< nRoomCnt; i++)
+		{
+			int left = Common.ImgPosion.GetX(mRoomPos[nRoomCnt - 1][i][0]);
+			int top = Common.ImgPosion.GetX(mRoomPos[nRoomCnt - 1][i][1]);
+			Log.d(TAG, "**************************초기화 : " + i);
+			roomView[i] = new RoomView(left, top , i);
+		}
+
+		// 현산 자동청정 기능 지원 여부 확인
+		//printDebugLog("[Create] - Support.InnerCycle [" + mVentilData.VentilStatus.Support.InnerCycle + "], Support.OutAirClean [" + mVentilData.VentilStatus.Support.OutAirClean + "], bAirQualitySensorUsage [" + bAirQualitySensorUsage + "]");
+		if (InnerCycle && OutAirClean && bAirQualitySensorUsage) bVentilSupportAutoClean = true;
+		printDebugLog("[Create] - bEasyModeUse [" + bEasyModeUse + "], bAirQualitySensorUsage [" + bAirQualitySensorUsage + "], bVentilCareService [" + bVentilCareService + "], bVentilSupportAutoClean [" + bVentilSupportAutoClean + "]");
+
+		// 3. Common - Image & Button Create
+		printDebugLog("[Create] - Step3 : Common - Image & Button Create");
+
+		IMG_BACKGROUND = new WpadImageView(context, TOUCH_KIND.NONE, 1181, 647, R.drawable.ctrl_ventil_back, 0, ID.VentilationMainScreenID.IMG.BACKGROUND);
+		ViewRegistration(layout, IMG_BACKGROUND, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(114));
+
+		if (bDisplayAirQuality) {
+			IMG_BACK_HOUSE = new WpadImageView(context, TOUCH_KIND.BUTTON_LC, 280, 306, R.drawable.ctrl_ventil_back_house, 0, ID.VentilationMainScreenID.IMG.BACKGROUND_SUB);
+			ViewRegistration(layout, IMG_BACK_HOUSE, Common.ImgPosion.GetX(203), Common.ImgPosion.GetY(221));
+
+			IMG_VENTIL_ANIM = new WpadImageView(context, TOUCH_KIND.NONE, 350, 82, R.drawable.ctrl_ventil_anim_normal_01, 0, ID.VentilationMainScreenID.IMG.FAN);
+			ViewRegistration(layout, IMG_VENTIL_ANIM, Common.ImgPosion.GetX(244), Common.ImgPosion.GetY(380));
+		}
+		else {
+			IMG_BACK_HOUSE = new WpadImageView(context, TOUCH_KIND.BUTTON_LC, 280, 306, R.drawable.ctrl_ventil_back_house, 0, ID.VentilationMainScreenID.IMG.BACKGROUND_SUB);
+			ViewRegistration(layout, IMG_BACK_HOUSE, Common.ImgPosion.GetX(203), Common.ImgPosion.GetY(313));
+
+			IMG_VENTIL_ANIM = new WpadImageView(context, TOUCH_KIND.NONE, 350, 82, R.drawable.ctrl_ventil_anim_normal_01, 0, ID.VentilationMainScreenID.IMG.FAN);
+			ViewRegistration(layout, IMG_VENTIL_ANIM, Common.ImgPosion.GetX(244), Common.ImgPosion.GetY(472));
+		}
+
+		TXT_INSTRUCTION = new WpadTextView(context, false, 1181, 57, Gravity.CENTER, Color.WHITE, Common.fontsize._32_POPUP_TITLE, true, ID.VentilationMainScreenID.TXT.INSTRUCTION);
+		ViewRegistration(layout, TXT_INSTRUCTION, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(114));
+		TXT_INSTRUCTION.setText("환기 동작 상태가 표시됩니다.");
+
+		TXT_ALARM_MESSAGE = new WpadTextView(context, true, 591, 40, Gravity.CENTER, Color.parseColor("#FF7E00"), Common.fontsize._26_DEFAULT, true, ID.VentilationMainScreenID.TXT.ALARM_MESSAGE);
+		ViewRegistration(layout, TXT_ALARM_MESSAGE, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(171));
+		TXT_ALARM_MESSAGE.setBackgroundResource(R.drawable.ctrl_ventil_back_alarmmsg);
+		TXT_ALARM_MESSAGE.setVisibility(View.INVISIBLE);
+
+		/** 환기 케어 서비스 버튼 추가 : SBS */
+		if (true) {
+			IMG_CARE_SERVICE = new WpadImageView(context, TOUCH_KIND.BUTTON, 130, 54,
+					new int[] { R.drawable.btn_venti_inqu_normal, R.drawable.btn_venti_inqu_pressed },
+					new int[] { R.drawable.btn_venti_inqu_normal, R.drawable.btn_venti_inqu_pressed },
+					ID.VentilationMainScreenID.BTN.FILLTER_SERVICE);
+			ViewRegistration(layout, IMG_CARE_SERVICE, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(541));
+		}
+
+		IMG_SANITIZATION_STATUS = new WpadImageView(context, TOUCH_KIND.BUTTON, 591, 40,
+				new int[] { R.drawable.venti_sanitiztion_bg_status, R.drawable.venti_sanitiztion_bg_status_off },
+				new int[] { R.drawable.venti_sanitiztion_bg_status, R.drawable.venti_sanitiztion_bg_status_off },
+				ID.VentilationMainScreenID.BTN.SANITIZTION_BG);
+		ViewRegistration(layout, IMG_SANITIZATION_STATUS, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(171));
+		IMG_SANITIZATION_STATUS.setVisibility(View.INVISIBLE);
+
+		/** 환기 케어 서비스 버튼 추가 end : SBS */
+
+		IMG_FILTER_CHANGE = new WpadImageView(context, TOUCH_KIND.BUTTON, 130, 54,
+				new int[] { R.drawable.ctrl_ventil_btn_filterchange_normal, R.drawable.ctrl_ventil_btn_filterchange_pressed },
+				new int[] { R.drawable.ctrl_ventil_btn_filterchange_warning, R.drawable.ctrl_ventil_btn_filterchange_pressed },
+				ID.VentilationMainScreenID.BTN.FILLTER_CHANGE);
+		ViewRegistration(layout, IMG_FILTER_CHANGE, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(457));
+		//IMG_FILTER_CHANGE.setVisibility(View.INVISIBLE);
+
+		// 환기장비 전원 On/Off
+		TXT_TITLE_ONOFF_POWER = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_POWER);
+		ViewRegistration(layout, TXT_TITLE_ONOFF_POWER, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(209));
+		TXT_TITLE_ONOFF_POWER.setText("전  원");
+//		TXT_TITLE_ONOFF_POWER.setBackgroundColor(Color.RED);
+
+		BTN_ONOFF_POWER = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+				new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+				new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+				ID.VentilationMainScreenID.BTN.ONOFF_POWER);
+		ViewRegistration(layout, BTN_ONOFF_POWER, Common.ImgPosion.GetX(799), Common.ImgPosion.GetY(209));
+		BTN_ONOFF_POWER.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		BTN_ONOFF_CONFIG = new WpadImageView(context, TOUCH_KIND.BUTTON, 66, 66, R.drawable.ctrl_ventil_btn_setreservation_normal, R.drawable.ctrl_ventil_btn_setreservation_pressed, ID.VentilationMainScreenID.BTN.ONOFF_CONFIG);
+		ViewRegistration(layout, BTN_ONOFF_CONFIG, Common.ImgPosion.GetX(947), Common.ImgPosion.GetY(209));
+		BTN_ONOFF_CONFIG.setTouchDelayMs(Common.BTN_DELAY_SHOWPOPUP);
+
+		// 환기 예약운전 On/Off
+		TXT_TITLE_ONOFF_RESERVATION = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_RESERVATION);
+		ViewRegistration(layout, TXT_TITLE_ONOFF_RESERVATION, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(308));
+		TXT_TITLE_ONOFF_RESERVATION.setText("예약운전");
+//		TXT_TITLE_ONOFF_RESERVATION.setBackgroundColor(Color.RED);
+
+		BTN_RESERVATION_CONFIG = new WpadImageView(context, TOUCH_KIND.BUTTON, 66, 66, R.drawable.ctrl_ventil_btn_setreservation_normal, R.drawable.ctrl_ventil_btn_setreservation_pressed, ID.VentilationMainScreenID.BTN.RESERVATION_SET);
+		ViewRegistration(layout, BTN_RESERVATION_CONFIG, Common.ImgPosion.GetX(947), Common.ImgPosion.GetY(299));
+		BTN_RESERVATION_CONFIG.setTouchDelayMs(Common.BTN_DELAY_SHOWPOPUP);
+
+		BTN_ONOFF_RESERVATION = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+				new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+				new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+				ID.VentilationMainScreenID.BTN.ONOFF_RESERVATION);
+		ViewRegistration(layout, BTN_ONOFF_RESERVATION, Common.ImgPosion.GetX(799), Common.ImgPosion.GetY(308));
+		BTN_ONOFF_RESERVATION.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+
+		// 제균 On/Off
+		TXT_TITLE_SANITIZATION = new WpadTextView(context, false, 81, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_SANITIZATION);
+		ViewRegistration(layout, TXT_TITLE_SANITIZATION, Common.ImgPosion.GetX(1019), Common.ImgPosion.GetY(308));
+		TXT_TITLE_SANITIZATION.setText("제 균");
+
+		BTN_ONOFF_SANITIZATION = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+				new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+				new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+				ID.VentilationMainScreenID.BTN.ONOFF_SANITIZATION);
+		ViewRegistration(layout, BTN_ONOFF_SANITIZATION, Common.ImgPosion.GetX(1100), Common.ImgPosion.GetY(308));
+		BTN_ONOFF_SANITIZATION.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		SetSanitiztion(sanitiztion);
+
+		// 각방환기 On/Off
+		TXT_TITLE_VENTILATION = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_VENTILATION);
+		ViewRegistration(layout, TXT_TITLE_VENTILATION, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(407));
+		TXT_TITLE_VENTILATION.setText("각방환기");
+//		TXT_TITLE_ONOFF_RESERVATION.setBackgroundColor(Color.RED);
+
+		BTN_ONOFF_VANITIZATION = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+				new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+				new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+				ID.VentilationMainScreenID.BTN.ONOFF_VENTILATION);
+		ViewRegistration(layout, BTN_ONOFF_VANITIZATION, Common.ImgPosion.GetX(799), Common.ImgPosion.GetY(407));
+		BTN_ONOFF_VANITIZATION.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+		SetRoomVentiOnOff(room_vanti);
+
+
+
+		// 상태밝기
+		TXT_TITLE_BRIGHTNESS = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_VENTILATION);
+		ViewRegistration(layout, TXT_TITLE_BRIGHTNESS, Common.ImgPosion.GetX(1019), Common.ImgPosion.GetY(407));
+		TXT_TITLE_BRIGHTNESS.setText("상태밝기");
+
+		IMG_BRIGHTNESS_STATUS = new WpadImageView(context, TOUCH_KIND.NONE, 66, 66, R.drawable.ctrl_ventil_icon_bright_1 , 0, ID.VentilationMainScreenID.IMG.BRIGHTNESS_STATUS);
+		ViewRegistration(layout, IMG_BRIGHTNESS_STATUS, Common.ImgPosion.GetX(1148), Common.ImgPosion.GetY(398));
+		IMG_BRIGHTNESS_STATUS.setVisibility(View.INVISIBLE);
+
+		BTN_PAGE_UP =  new WpadImageView(getContext(), TOUCH_KIND.BUTTON, 60, 54, R.drawable.btn_venti_room_box_back_normal, R.drawable.btn_venti_room_box_back_pressed, ID.VentilationMainScreenID.BTN.ROOM_BACK );
+		ViewRegistration(getLayout(), BTN_PAGE_UP, Common.ImgPosion.GetX(685), Common.ImgPosion.GetY(504));
+
+		BTN_PAGE_DOWN =  new WpadImageView(getContext(), TOUCH_KIND.BUTTON, 60, 54, R.drawable.btn_venti_room_box_next_normal, R.drawable.btn_venti_room_box_next_pressed, ID.VentilationMainScreenID.BTN.ROOM_NEXT );
+		ViewRegistration(getLayout(), BTN_PAGE_DOWN, Common.ImgPosion.GetX(1162), Common.ImgPosion.GetY(504));
+
+		if(nRoomCnt == 4)
+		{
+			BTN_PAGE_DOWN.setImageResource(R.drawable.btn_venti_room_box_next_disabled);
+			BTN_PAGE_UP.setImageResource(R.drawable.btn_venti_room_box_back_disabled);
+			BTN_PAGE_DOWN.setEnabled(false);
+			BTN_PAGE_UP.setEnabled(false);
+		}
+
+		// 현산 자동청정 기능 지원 여부 확인
+		if (InnerCycle && OutAirClean && bAirQualitySensorUsage) bVentilSupportAutoClean = true;
+
+		// 현산 자동청정 On/Off
+		if (bVentilSupportAutoClean) {
+			TXT_TITLE_ONOFF_AUTOCLEAN = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_AUTOCLEAN);
+			ViewRegistration(layout, TXT_TITLE_ONOFF_AUTOCLEAN, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(407));
+			TXT_TITLE_ONOFF_AUTOCLEAN.setText("자동청정");
+//			TXT_TITLE_ONOFF_AUTOCLEAN.setBackgroundColor(Color.RED);
+
+			BTN_ONOFF_AUTOCLEAN = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+					new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+					new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+					ID.VentilationMainScreenID.BTN.ONOFF_AUTOCLEAN);
+			ViewRegistration(layout, BTN_ONOFF_AUTOCLEAN, Common.ImgPosion.GetX(799), Common.ImgPosion.GetY(407));
+			BTN_ONOFF_AUTOCLEAN.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+		}
+		else {
+			if (AutoDriving) {
+				TXT_TITLE_ONOFF_AUTO = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_MODE_AUTO);
+				ViewRegistration(layout, TXT_TITLE_ONOFF_AUTO, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(407));
+				TXT_TITLE_ONOFF_AUTO.setText("자동운전");
+//			TXT_TITLE_ONOFF_AUTO.setBackgroundColor(Color.RED);
+
+				BTN_VENTILMODE_AUTO = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+						new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+						new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+						ID.VentilationMainScreenID.BTN.MODE_AUTODRIVING);
+				ViewRegistration(layout, BTN_VENTILMODE_AUTO, Common.ImgPosion.GetX(799), Common.ImgPosion.GetY(407));
+				BTN_VENTILMODE_AUTO.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+			}
+		}
+
+		// 환기 히터 On/Off
+		if (Support.Heater) {
+			TXT_TITLE_ONOFF_HEATER = new WpadTextView(context, false, 130, 48, Gravity.CENTER, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_ONOFF_HEATER);
+			ViewRegistration(layout, TXT_TITLE_ONOFF_HEATER, Common.ImgPosion.GetX(948), Common.ImgPosion.GetY(407));
+			TXT_TITLE_ONOFF_HEATER.setText("히  터");
+//			TXT_TITLE_ONOFF_HEATER.setBackgroundColor(Color.RED);
+
+			BTN_ONOFF_HEATER = new WpadImageView(context, TOUCH_KIND.BUTTON, 122, 48,
+					new int[] { R.drawable.control_venti_btn_onoff_off, R.drawable.control_venti_btn_onoff_off },
+					new int[] { R.drawable.control_venti_btn_onoff_on, R.drawable.control_venti_btn_onoff_on },
+					ID.VentilationMainScreenID.BTN.ONOFF_HEATER);
+			ViewRegistration(layout, BTN_ONOFF_HEATER, Common.ImgPosion.GetX(1087), Common.ImgPosion.GetY(407));
+			BTN_ONOFF_HEATER.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+		}
+
+		// 4. Other - Image & Button Create
+		printDebugLog("[Create] - Step4 : Other - Image & Button Create");
+
+		// 환기 동작 모드
+		TXT_TITLE_MODE = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_VENTILMODE);
+		ViewRegistration(layout, TXT_TITLE_MODE, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(606));
+		TXT_TITLE_MODE.setText("환기모드");
+//		TXT_TITLE_MODE.setBackgroundColor(Color.RED);
+
+		// 일반환기 모드
+		BTN_VENTILMODE_NORMAL = new WpadImageView(context, TOUCH_KIND.BUTTON, 98, 54,
+				new int[] { R.drawable.ctrl_ventil_btn_mode_normal_normal, R.drawable.ctrl_ventil_btn_mode_normal_pressed },
+				new int[] { R.drawable.ctrl_ventil_btn_mode_normal_selected, R.drawable.ctrl_ventil_btn_mode_normal_pressed },
+				ID.VentilationMainScreenID.BTN.MODE_NORMAL);
+		ViewRegistration(layout, BTN_VENTILMODE_NORMAL, Common.ImgPosion.GetX(801), Common.ImgPosion.GetY(603));
+		BTN_VENTILMODE_NORMAL.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		// 자연환기 모드 (바이패스 모드)
+		if (Support.ByPass) {
+			if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) {
+				BTN_VENTILMODE_NATURAL = new WpadImageView(context, TOUCH_KIND.BUTTON, 98, 54,
+						new int[] { R.drawable.ctrl_ventil_btn_mode_bypass_normal, R.drawable.ctrl_ventil_btn_mode_bypass_selected },
+						new int[] { R.drawable.ctrl_ventil_btn_mode_bypass_selected, R.drawable.ctrl_ventil_btn_mode_bypass_selected },
+						ID.VentilationMainScreenID.BTN.MODE_BYPASS);
+				ViewRegistration(layout, BTN_VENTILMODE_NATURAL, Common.ImgPosion.GetX(904), Common.ImgPosion.GetY(603));
+				BTN_VENTILMODE_NATURAL.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+			}
+			else {
+				BTN_VENTILMODE_NATURAL = new WpadImageView(context, TOUCH_KIND.BUTTON, 98, 54,
+						new int[] { R.drawable.ctrl_ventil_btn_mode_natural_normal, R.drawable.ctrl_ventil_btn_mode_natural_selected },
+						new int[] { R.drawable.ctrl_ventil_btn_mode_natural_selected, R.drawable.ctrl_ventil_btn_mode_natural_selected },
+						ID.VentilationMainScreenID.BTN.MODE_BYPASS);
+				ViewRegistration(layout, BTN_VENTILMODE_NATURAL, Common.ImgPosion.GetX(904), Common.ImgPosion.GetY(603));
+				BTN_VENTILMODE_NATURAL.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+			}
+		}
+
+		// 내부순환 모드 (공기청정 모드)
+		if (Support.InnerCycle) {
+			BTN_VENTILMODE_INTERNALCIRCUL = new WpadImageView(context, TOUCH_KIND.BUTTON, 98, 54,
+					new int[] { R.drawable.ctrl_ventil_btn_mode_internal_normal, R.drawable.ctrl_ventil_btn_mode_internal_pressed },
+					new int[] { R.drawable.ctrl_ventil_btn_mode_internal_selected, R.drawable.ctrl_ventil_btn_mode_internal_pressed },
+					ID.VentilationMainScreenID.BTN.MODE_INNERCYCLE);
+			ViewRegistration(layout, BTN_VENTILMODE_INTERNALCIRCUL, Common.ImgPosion.GetX(1006), Common.ImgPosion.GetY(603));
+			BTN_VENTILMODE_INTERNALCIRCUL.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+		}
+
+		// 외기청정 모드 (공기청정 + 외기흡기)
+		if (Support.OutAirClean) {
+			BTN_VENTILMODE_EXTERNALAIRCLEAN = new WpadImageView(context, TOUCH_KIND.BUTTON, 98, 54,
+					new int[] { R.drawable.ctrl_ventil_btn_mode_externalclean_normal, R.drawable.ctrl_ventil_btn_mode_externalclean_pressed },
+					new int[] { R.drawable.ctrl_ventil_btn_mode_externalclean_selected, R.drawable.ctrl_ventil_btn_mode_externalclean_pressed },
+					ID.VentilationMainScreenID.BTN.MODE_OUTAIRCLEAN);
+			ViewRegistration(layout, BTN_VENTILMODE_EXTERNALAIRCLEAN, Common.ImgPosion.GetX(1109), Common.ImgPosion.GetY(603));
+			BTN_VENTILMODE_EXTERNALAIRCLEAN.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+		}
+
+		// 풍량 조절
+		TXT_TITLE_WIND = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_WINDVOL);
+		ViewRegistration(layout, TXT_TITLE_WIND, Common.ImgPosion.GetX(660), Common.ImgPosion.GetY(705));
+		TXT_TITLE_WIND.setText("풍  량");
+//		TXT_TITLE_WIND.setBackgroundColor(Color.RED);
+
+		// 미풍
+		BTN_WIND_01 = new WpadImageView(context, TOUCH_KIND.BUTTON, 129, 54,
+				new int[] { R.drawable.ctrl_ventil_btn_wind_01_normal, R.drawable.ctrl_ventil_btn_wind_01_pressed },
+				new int[] { R.drawable.ctrl_ventil_btn_wind_01_selected, R.drawable.ctrl_ventil_btn_wind_01_pressed },
+				ID.VentilationMainScreenID.BTN.WIND_1);
+		ViewRegistration(layout, BTN_WIND_01, Common.ImgPosion.GetX(800), Common.ImgPosion.GetY(702));
+		BTN_WIND_01.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		// 약풍
+		BTN_WIND_02 = new WpadImageView(context, TOUCH_KIND.BUTTON, 129, 54,
+				new int[] { R.drawable.ctrl_ventil_btn_wind_02_normal, R.drawable.ctrl_ventil_btn_wind_02_pressed },
+				new int[] { R.drawable.ctrl_ventil_btn_wind_02_selected, R.drawable.ctrl_ventil_btn_wind_02_pressed },
+				ID.VentilationMainScreenID.BTN.WIND_2);
+		ViewRegistration(layout, BTN_WIND_02, Common.ImgPosion.GetX(939), Common.ImgPosion.GetY(702));
+		BTN_WIND_02.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		// 강픙
+		BTN_WIND_03 = new WpadImageView(context, TOUCH_KIND.BUTTON, 129, 54,
+				new int[] { R.drawable.ctrl_ventil_btn_wind_03_normal, R.drawable.ctrl_ventil_btn_wind_03_pressed },
+				new int[] { R.drawable.ctrl_ventil_btn_wind_03_selected, R.drawable.ctrl_ventil_btn_wind_03_pressed },
+				ID.VentilationMainScreenID.BTN.WIND_3);
+		ViewRegistration(layout, BTN_WIND_03, Common.ImgPosion.GetX(1078), Common.ImgPosion.GetY(702));
+		BTN_WIND_03.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL_VENTIL);
+
+		// 타이머
+		TXT_TITLE_TIMER = new WpadTextView(context, false, 130, 48, Gravity.LEFT, Color.WHITE, FONT_SIZE_TITLE_NORMAL, true, ID.VentilationMainScreenID.TXT.TITLE_TIMER);
+		ViewRegistration(layout, TXT_TITLE_TIMER, Common.ImgPosion.GetX(49), Common.ImgPosion.GetY(705));
+		TXT_TITLE_TIMER.setText("타이머");
+//		TXT_TITLE_TIMER.setBackgroundColor(Color.RED);
+
+		// 타이머 왼쪽 버튼
+		BTN_TIMER_LEFT = new WpadImageView(context, TOUCH_KIND.BUTTON, 80, 54, R.drawable.control_venti_btn_arrow_back_normal, R.drawable.control_venti_btn_arrow_back_pressed, ID.VentilationMainScreenID.BTN.TIMER_LEFT);
+		ViewRegistration(layout, BTN_TIMER_LEFT, Common.ImgPosion.GetX(179), Common.ImgPosion.GetY(702));
+		BTN_TIMER_LEFT.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL);
+
+		// 타이머 오른쪽 버튼
+		BTN_TIMER_RIGHT = new WpadImageView(context, TOUCH_KIND.BUTTON, 80, 54, R.drawable.control_venti_btn_arrow_next_normal, R.drawable.control_venti_btn_arrow_next_pressed, ID.VentilationMainScreenID.BTN.TIMER_RIGHT);
+		ViewRegistration(layout, BTN_TIMER_RIGHT, Common.ImgPosion.GetX(506), Common.ImgPosion.GetY(702));
+		BTN_TIMER_RIGHT.setTouchDelayMs(Common.BTN_DELAY_DEVCTRL);
+
+		// 타이머 상태
+		TXT_TIMER = new WpadTextView(context, false, 247, 54, Gravity.CENTER, Color.WHITE, Common.fontsize._36, true, ID.VentilationMainScreenID.TXT.TIMER_VALUE);
+		ViewRegistration(layout, TXT_TIMER, Common.ImgPosion.GetX(259), Common.ImgPosion.GetY(702));
+
+		// 5. Draw_Update
+		printDebugLog("[Create] - Step5 : Draw_Update");
+
+		// 공기질 표시 구역 컴포넌트 등록
+		if (bDisplayAirQuality) registerAirQualityFragment(context, layout);
+
+		//     6.1. 환기 에니메이션용 Handler
+		registerVentilModeAnimHandler();
+
+		//      6.2. 필터교환 에니메이션용 Handler
+		registerFilterChangeAnimHandler();
+
+		updateScreen();
+
+
+		if (MainActivity.getHideMenuOn()) mTransactionDisplay = new TransactionDisplay(true, (WallPadDevAPI) null, (WpadScreen) this);
+
+
+		if (mAirQualitySensorAPI != null) {
+			registerAirSensorBR(true);
+		}
+		updateAirQualityFragment();
+
+		// 현산모델에서 안전모드일시 시작과 동시에 알람팝업을 띄움
+		if (Version.getGatewayUsage()) {
+			if (Fault.SafeMode) {
+				Handler PopupHandler = new Handler() {
+					@SuppressLint("HandlerLeak")
+					@Override
+					public void handleMessage(Message msg) {
+						if (msg.what == 0) {
+							// 안전모드 팝업
+							startAlarmPopup(ID.VentiPopup_Alarm.kind.SafeMode);
+						}
+					}
+				};
+				PopupHandler.sendEmptyMessageDelayed(0, 300);
+			}
+		}
+	}
+
+	protected void SetSanitiztion(boolean _onoff)
+	{
+		if(!OnOff)
+		{
+			sanitiztion = false;
+			BTN_ONOFF_SANITIZATION.setButtonFrontImage();
+			IMG_SANITIZATION_STATUS.setVisibility(View.INVISIBLE);
+			return;
+		}
+
+		sanitiztion = _onoff;
+		if (sanitiztion)
+		{
+			BTN_ONOFF_SANITIZATION.setButtonRearImage();
+			IMG_SANITIZATION_STATUS.setVisibility(View.VISIBLE);
+		}
+		else
+		{
+			BTN_ONOFF_SANITIZATION.setButtonFrontImage();
+			IMG_SANITIZATION_STATUS.setVisibility(View.INVISIBLE);
+		}
+	}
+
+
+	protected void SetRoomVentiOnOff(boolean _onoff)
+	{
+		if(!OnOff)
+		{
+			room_vanti = false;
+			BTN_ONOFF_VANITIZATION.setButtonFrontImage();
+			int status;
+			for(int i = 0 ; i< roomView.length; i++)
+			{
+				switch (i)
+				{
+					case 0:
+						status = 0;
+						break;
+					case 1:
+						status = 3;
+						break;
+					case 2:
+						status = 2;
+						break;
+					case 3:
+						status = 1;
+						break;
+					default:
+						status = 0;
+						break;
+				}
+				roomView[i].setStatus(false, status);
+			}
+			return;
+		}
+
+		room_vanti = _onoff;
+		if (room_vanti)
+		{
+
+			BTN_ONOFF_VANITIZATION.setButtonRearImage();
+			int status;
+			for(int i = 0 ; i< roomView.length; i++)
+			{
+				switch (i)
+				{
+					case 0:
+						status = 0;
+						break;
+					case 1:
+						status = 3;
+						break;
+					case 2:
+						status = 2;
+						break;
+					case 3:
+						status = 1;
+						break;
+					default:
+						status = 0;
+						break;
+				}
+				roomView[i].setStatus(true, status);
+			}
+		}
+		else
+		{
+			BTN_ONOFF_VANITIZATION.setButtonFrontImage();
+			int status;
+			for(int i = 0 ; i< roomView.length; i++)
+			{
+				switch (i)
+				{
+					case 0:
+						status = 0;
+						break;
+					case 1:
+						status = 3;
+						break;
+					case 2:
+						status = 2;
+						break;
+					case 3:
+						status = 1;
+						break;
+					default:
+						status = 0;
+						break;
+				}
+				roomView[i].setStatus(false, status);
+			}
+		}
+	}
+
+	private void registerVentilModeAnimHandler() {
+		try {
+			mVentilAnimHandler = new Handler() {
+				@SuppressLint("HandlerLeak")
+				@Override
+				public void handleMessage(Message msg) {
+					//Log.d(TAG, "FanAnimHandler - msg.what = " + msg.what);
+
+					if (Support.ByPass && ByPass) {
+						// 자연환기 동작중 애니메이션 이미지 지정
+						mVentilAnim = mAnimModeNatural;
+					}
+					else if (Support.InnerCycle && InnerCycle) {
+						// 내부순환 동작중 애니메이션 이미지 지정
+						mVentilAnim = mAnimModeInternalCircul;
+					}
+					else if (Support.OutAirClean && OutAirClean) {
+						// 외기청정 동작중 애니메이션 이미지 지정
+						mVentilAnim = mAnimModeExternalClean;
+					}
+					else {
+						// 나머지의 경우 일반환기 동작중 애니메이션 지정
+						mVentilAnim = mAnimModeNormal;
+					}
+
+					if (msg.what == 1) {
+						if (mVentilAnimImgCnt >= mVentilAnim.length) mVentilAnimImgCnt = 0;
+						IMG_VENTIL_ANIM.setImageResource(mVentilAnim[mVentilAnimImgCnt]);
+						mVentilAnimImgCnt++;
+						if (mVentilAnimHandler != null) mVentilAnimHandler.sendEmptyMessageDelayed(msg.what, 400);
+					}
+					else if (msg.what == 2) {
+						if (mVentilAnimImgCnt >= mVentilAnim.length) mVentilAnimImgCnt = 0;
+						IMG_VENTIL_ANIM.setImageResource(mVentilAnim[mVentilAnimImgCnt]);
+						mVentilAnimImgCnt++;
+						if (mVentilAnimHandler != null) mVentilAnimHandler.sendEmptyMessageDelayed(msg.what, 300);
+					}
+					else if (msg.what == 3) {
+						if (mVentilAnimImgCnt >= mVentilAnim.length) mVentilAnimImgCnt = 0;
+						IMG_VENTIL_ANIM.setImageResource(mVentilAnim[mVentilAnimImgCnt]);
+						mVentilAnimImgCnt++;
+						if (mVentilAnimHandler != null) mVentilAnimHandler.sendEmptyMessageDelayed(msg.what, 200);
+					}
+				}
+			};
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] registerVentilModeAnimHandler()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	private void registerFilterChangeAnimHandler() {
+		try {
+			mFilterChangeHandler = new Handler() {
+				@SuppressLint("HandlerLeak")
+				@Override
+				public void handleMessage(Message msg) {
+					//Log.d(TAG, "FanAnimHandler - msg.what = " + msg.what);
+					if (msg.what == 0) {
+						mFilterChangeHandlerRun = false;
+						IMG_FILTER_CHANGE.setVisibility(View.INVISIBLE);
+						bFilterChange = false;
+					}
+
+					if (msg.what == 1) {
+						mFilterChangeHandlerRun = true;
+						if (Support.FilterReset) {
+							if (IMG_FILTER_CHANGE.getVisibility() == View.INVISIBLE) {
+								IMG_FILTER_CHANGE.setVisibility(View.VISIBLE);
+								bFilterChange = true;
+							}
+							IMG_FILTER_CHANGE.setButtonFrontImage();
+						}
+						else {
+							IMG_FILTER_CHANGE.setVisibility(View.VISIBLE);
+							bFilterChange = true;
+						}
+						mFilterChangeHandler.sendEmptyMessageDelayed(2, 1000);
+					}
+					else if (msg.what == 2) {
+						mFilterChangeHandlerRun = true;
+						if (Support.FilterReset) {
+							IMG_FILTER_CHANGE.setButtonRearImage();
+						}
+						else {
+							IMG_FILTER_CHANGE.setVisibility(View.INVISIBLE);
+							bFilterChange = false;
+						}
+						mFilterChangeHandler.sendEmptyMessageDelayed(1, 1000);
+					}
+				}
+			};
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] registerFilterChangeAnimHandler()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 본 스크린 종료시 호출됨
+	 */
+	@Override
+	protected void onClose() {
+		super.onClose();
+
+		// 등록된 BR 을 해제 한다.
+		if (MainActivity.getHideMenuOn()) { if(mTransactionDisplay != null) mTransactionDisplay.Close(); }
+
+		if (bAirQualitySensorUsage) {
+			if (mAirQualitySensorAPI != null) registerAirSensorBR(false);
+		}
+
+		drawAirFlowAnim((byte)0x00);
+		mVentilAnimHandler = null;
+
+		Log.i(TAG, "[END   - Screen] ********************************************");
+	}
+
+	// =================================================================================================
+	// [[ BroadcastReceiver ]] region
+	// =================================================================================================
+	/**
+	 * 부모 Activity 에서 BroadcastReceiver 을 수신받을시 호출됨
+	 */
+	@Override
+	protected void onBrReceive(Intent intent) {
+		super.onBrReceive(intent);
+
+		String ActionName = intent.getAction();
+
+		printDebugLog("[[[[ onBrReceive ]]]]  ActionName = " + ActionName);
+		if (ActionName.equals(ID.VentilationMainScreenID.BR_VENTI)) {
+			printDebugLog("onBrReceive - BR_VENTI");
+			updateVentilatorData(false);
+			updateScreen();
+		}
+		else if (ActionName.equals(ID.AirQualityMainScreenID.BR_AIRQUALITY)) {
+			if (bAirQualitySensorUsage) {
+				printDebugLog("onBrReceive - BR_AIRQUALITY");
+				updateAirSensorData(false);
+				updateAirQualityFragment();
+			}
+		}
+	}
+
+	/**
+	 * 팝업 Activity에서 Result 를 전달 받았을시 호출된다.
+	 */
+	@Override
+	protected void onPopupResult(Intent intent) {
+		super.onPopupResult(intent);
+
+		if (intent != null) {
+			int nScreenID = intent.getIntExtra("SCREEN", -1);
+			if (nScreenID == ID.screen.VentiPopupAlarmScreen) {
+				int nKind = intent.getIntExtra("KIND", -1);
+				boolean bOK = intent.getBooleanExtra("OK", false);
+
+				printDebugLog("[onPopupResult] bOK [" + bOK + "], nKind [" + nKind + "]");
+
+				if (bOK) {
+					if (nKind == ID.VentiPopup_Alarm.kind.ReservationClear) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceReservation(false);
+						}
+						else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+							Sample_ReservationOnOff(false);
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.HeaterOn) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceHeater(true);
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.FilterReset) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceResetFilter();
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.SafeMode) {
+
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.HDCAutoAirCleanOn) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceAutoVentil(true);
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.CancelHDCAutoAirCleanNRunReservation) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceAutoAirClean(false);
+							ctrlDeviceReservation(true);
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.CancelReservationNRunAutoAirClean) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceReservation(false);
+							ctrlDevicePower(true);
+							ctrlDeviceAutoAirClean(true);
+						}
+					}
+					else if (nKind == ID.VentiPopup_Alarm.kind.AirQualityFanWarning) {
+						if (OPERATION_MODE == Common.MODE_NOMAL) {
+							ctrlDeviceAirQualitySensorFan(AirQualityData.Device.FanMode.Always);
+							ctrlDevicePower(true);
+							ctrlDeviceAutoAirClean(true);
+//							if (super.setChangeScreen(API_Menu.SubMenuCtrl.Inner_AirQuality)) {
+//								ctrlDeviceAirQualitySensorFan(AirQualityData.FanMode.Always);
+//								ctrlDevicePower(true);
+//								ctrlDeviceAutoAirClean(true);
+//								// 환기 뒤로가기 버튼 생성(공기질 --> 환기)
+////								((MainActivity)(getContext())).setVentilBackBtnVisible(true);
+//							}
+						}
+					}
+				}
+			}
+			else if (nScreenID == ID.screen.VentiPopupReservationScreen) {
+				if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					boolean Reservation = intent.getBooleanExtra("Reservation", false);
+					Sample_ReservationOnOff(Reservation);
+				}
+			}
+		}
+	}
+
+	// =================================================================================================
+	// [[ Touch & Key Event ]] region
+	// =================================================================================================
+	/**
+	 * 본 클래스에서 등록한 [WpadImageView] [WpadTextView] 의 TouchEvent 가 있을시 호출됨
+	 */
+	@Override
+	protected void onTouchEvent(View v, MotionEvent event) {
+		super.onTouchEvent(v, event);
+
+		int nTargetID = v.getId();
+		int nMoveEvent = event.getAction();
+
+//		printDebugLog("[onTouchEvent] nMoveEvent [" + nMoveEvent + "]");
+
+		if (nMoveEvent == MotionEvent.ACTION_UP) {
+			printDebugLog("[onTouchEvent] nTargetID [" + nTargetID + "]");
+			if (nTargetID == ID.VentilationMainScreenID.TXT.ALARM_MESSAGE) {
+				printDebugLog("[onTouchEvent] ALARMMSG");
+				startAlarmPopup(ID.VentiPopup_Alarm.kind.DeviceError);
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_POWER) {
+				// ON/OFF
+				OnOff =!OnOff;
+
+
+
+				printDebugLog("[onTouchEvent] ONOFF_POWER");
+				if (Version.getGatewayUsage()) {
+					if (Fault.SafeMode) {
+						// 안전모드 팝업
+						startAlarmPopup(ID.VentiPopup_Alarm.kind.SafeMode);
+						return;
+					}
+				}
+
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					int ret = ctrlDevicePower(OnOff);
+					if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					//OnOff를 다르게 해서 저장
+
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Sample_PowerOnOff();
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+
+				if(OnOff)
+					IMG_BRIGHTNESS_STATUS.setVisibility(View.VISIBLE);
+				else
+				{
+					IMG_BRIGHTNESS_STATUS.setVisibility(View.INVISIBLE);
+				}
+
+				if(!OnOff)
+				{
+					SetRoomVentiOnOff(false);
+					SetSanitiztion(false);
+				}
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_AUTOCLEAN) {
+				// 자동청정
+				HDCAutoAirClean = !HDCAutoAirClean;
+				printDebugLog("[onTouchEvent] ONOFF_AUTOCLEAN");
+
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.CancelReservationNRunAutoAirClean);
+					return;
+				}
+
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+
+					if (mAirQualityData == null) {
+						Log.w(TAG, "[onTouchEvent] mAirQualityData is null!!");
+						return;
+					}
+
+					// 공기질 센서 팬 동작 모드 상태를 확인하여, 상시 동작모드가 아니면 팬 동작 모드를 팝엉 알림 후 상시 동작모드로 동작 시킨다.
+//					if (mAirQualityData.device.bAutoFanCtrl || mAirQualityData.device.hFanMode == AirQualityData.Device.FanMode.Off) {
+//						startAlarmPopup(ID.VentiPopup_Alarm.kind.AirQualityFanWarning);
+//						return;
+//					}
+
+					if (!OnOff)  {
+						// 전원을 On 시켜주세요 팝업 알람
+						startAlarmPopup(ID.VentiPopup_Alarm.kind.TurnOnVentilPower);
+						return;
+//						int ret = ctrlDevicePower(true);
+//						if (ret < 0) {
+//							Sound().Play(SND.effect.TOUCH_UNLATCHED);
+//							return;
+//						}
+					}
+
+					// 공기질 센서 팬 동작 모드가 자동이 아니고, 꺼져 있는 경우에는 Auto 동작 모드로 동작 시킨다.
+					if (!mAirQualityData.device.bAutoFanCtrl && mAirQualityData.device.hFanMode == AirQualityData.Device.FanMode.Off) {
+						int ret = ctrlDeviceAirQualitySensorFan(AirQualityData.Device.FanMode.Auto);
+						if (ret < 0) {
+							Sound().Play(SND.effect.TOUCH_UNLATCHED);
+							return;
+						}
+					}
+
+					int ret = ctrlDeviceAutoAirClean(HDCAutoAirClean);
+					if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+
+
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Sample_PowerOnOff();
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_RESERVATION) {
+				Reservation = !Reservation;
+				// 예약
+				printDebugLog("[onTouchEvent] ONOFF_RESERVATION");
+
+				if (HDCAutoAirClean) {
+					// 자동청정기능이 동작중입니다.
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.CancelHDCAutoAirCleanNRunReservation);
+					return;
+				}
+
+				int ret = ctrlDeviceReservation(Reservation);
+				if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+				else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+				updateScreen();
+
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.RESERVATION_SET) {
+				// 예약운전
+				printDebugLog("[onTouchEvent] ONOFF_POWER");
+
+				Sound().Play(SND.effect.TOUCH_LATCHED);
+
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					((MainActivity)(getContext())).StartPopup(ID.screen.VentiPopupReservationScreen);
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Intent intent = new Intent();
+					intent.putExtra("Reservation", Reservation);
+					((MainActivity)(getContext())).StartPopup(ID.screen.VentiPopupReservationScreen, intent);
+				}
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_HEATER) {
+				// 히터
+				printDebugLog("onTouchEvent [HEATER] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) return;
+
+				if (HeaterStatus == Venti.HEATER.OFF) {
+					// 히터알람 팝업
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.HeaterOn);
+				}
+				else {
+					int ret = ctrlDeviceHeater(false);
+					if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+				}
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_NORMAL) {
+				// 일반환기
+				printDebugLog("onTouchEvent [MODE_NORMAL] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) return;
+
+				if (Support2.WindowVenti && Reservation) {
+					printDebugLog("[onTouchEvent] ========== jeff 1 ==========");
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				if (Reservation) {
+					printDebugLog("[onTouchEvent] ========== jeff 2 ==========");
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				SetMode(NormalMode);
+
+				int ret = -99;
+				if (ByPass) {
+					ret = ctrlDeviceNaturalVentil(false);
+					if (ret < 0) {
+						Sound().Play(SND.effect.TOUCH_UNLATCHED);
+						return;
+					}
+				}
+
+				if (InnerCycle) {
+					ret = ctrlDeviceInternalVentil(false);
+					if (ret < 0) {
+						Sound().Play(SND.effect.TOUCH_UNLATCHED);
+						return;
+					}
+				}
+
+				if (OutAirClean) {
+					ret = ctrlDeviceOutAirClean(false);
+					if (ret < 0) {
+						Sound().Play(SND.effect.TOUCH_UNLATCHED);
+						return;
+					}
+				}
+
+				ret = 0;
+				if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+				else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_BYPASS) {
+
+				// 자연환기
+				printDebugLog("onTouchEvent [BYPASS] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) return;
+
+				SetMode(Mode.ByPassMode);
+				if (Support2.WindowVenti && Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+
+				int ret = ctrlDeviceNaturalVentil(ByPass);
+				if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+				else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+
+				updateScreen();
+
+
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_AUTODRIVING) {
+				// 자동환기
+
+				printDebugLog("onTouchEvent [AUTODRIVING] BUTTON !!!");
+
+				// 예약운전 OFF, 타이머 OFF  체크
+				if (Reservation) {
+					if (Support2.WindowVenti) {
+						// 예약중입니다 팝업 알람
+						startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+						return;
+					}
+					else {
+						return;
+					}
+				}
+
+				if (Timer != 0) return;
+
+
+				if (AutoDriving == false) {
+					// 자동운전 알림 팝업
+					if (Support2.WindowVenti) {
+						// 창호 환기 - 자동모드(하이브리드)
+						// 자동모드 설정 팝업 생성 안하고 바로 제어
+
+						int ret = ctrlDeviceAutoVentil(true);
+						if(ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+					else {
+						// 일반 전열교환기(일반 환기장비)
+//						startAlarmPopup(ID.VentiPopup_Alarm.kind.HDCAutoAirCleanOn);
+						int ret = ctrlDeviceAutoVentil(true);
+						if(ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+				}
+				else {
+					int ret = ctrlDeviceAutoVentil(false);
+					if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+				}
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_INNERCYCLE) {
+				// 내부순환
+				printDebugLog("onTouchEvent [INNERCYCLE] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) {
+					return;
+				}
+
+				// 예약중 체크
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				SetMode(Mode.InnerCycleMode);
+				if (OPERATION_MODE == Common.MODE_NOMAL){
+					if (InnerCycle) {
+						// 사용중일때 눌림 : On -> Off
+						int ret = ctrlDeviceInternalVentil(false);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+					else {
+						// Off -> On
+						int ret = ctrlDeviceInternalVentil(true);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE){
+					Sample_InnerCycle(!InnerCycle);
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_OUTAIRCLEAN) {
+				// 내부순환
+				printDebugLog("onTouchEvent [OUTAIRCLEAN] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) {
+					return;
+				}
+
+				// 예약중 체크
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				SetMode(Mode.OutAirCleanMode);
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					if (OutAirClean) {
+						// 사용중일때 눌림 : On -> Off
+						int ret = ctrlDeviceOutAirClean(false);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+					else {
+						// Off -> On
+						int ret = ctrlDeviceOutAirClean(true);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Sample_OutAirClean(!OutAirClean);
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.MODE_SLEEP) {
+				// 취침 모드
+				printDebugLog("onTouchEvent [SLEEP] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) {
+					return;
+				}
+
+				if (Support2.WindowVenti && Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					if (Sleep == Venti.SLEEP.SLEEP_ON) {
+						// 사용중일때 눌림 : On -> Off
+						int ret = ctrlDeviceSleepMode(false);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+					else {
+						// Off -> On
+						int ret = ctrlDeviceSleepMode(true);
+						if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					boolean onoff = false;
+					if (Sleep == Venti.SLEEP.SLEEP_ON) onoff = true;
+
+					Sample_SleepMode(onoff);
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+
+				updateScreen();
+			}
+			else if ((nTargetID >= ID.VentilationMainScreenID.BTN.WIND_1) && (nTargetID <= ID.VentilationMainScreenID.BTN.WIND_3)) {
+				// 풍량변경 [약풍 , 미풍 , 강풍]
+				int index = nTargetID - ID.VentilationMainScreenID.BTN.WIND_1;
+				printDebugLog("onTouchEvent [WIND_" + (index+1) + "] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) {
+					return;
+				}
+
+				// 예약중 체크
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				// 동일한 풍량을 눌렀을 경우
+				if (Wind == (byte) (index + 1)) {
+					return;
+				}
+
+				Wind = (byte)(index + 1);
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					int ret = ctrlDeviceWindType(Wind);
+					if(ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Sample_WindCont(Wind);
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+				updateScreen();
+			}
+			else if ((nTargetID == ID.VentilationMainScreenID.BTN.TIMER_LEFT) || (nTargetID == ID.VentilationMainScreenID.BTN.TIMER_RIGHT)) {
+				// 타이머 변경 [좌 , 우]
+				if (nTargetID == ID.VentilationMainScreenID.BTN.TIMER_LEFT) printDebugLog("onTouchEvent [TIMER_LEFT] BUTTON !!!");
+				else printDebugLog("onTouchEvent [TIMER_RIGHT] BUTTON !!!");
+
+				// 전원 OFF 체크
+				if (!OnOff) return;
+
+				// 예약중 체크
+				if (Reservation) {
+					// 예약중입니다 팝업 알람
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.ReservationClear);
+					return;
+				}
+
+				if (OPERATION_MODE == Common.MODE_NOMAL) {
+					Timer = getNextTimerValue(nTargetID);
+					int ret = ctrlDeviceTimer(Timer);
+					if (ret >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+					else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+				}
+				else if (OPERATION_MODE == Common.MODE_BUSINESS_SAMPLE) {
+					Sample_TimerCont(nTargetID);
+					Sound().Play(SND.effect.TOUCH_LATCHED);
+				}
+
+				updateScreen();
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.FILLTER_CHANGE) {
+				printDebugLog("onTouchEvent [FILLTER_CHANGE] BUTTON !!!");
+
+				if (Support.FilterReset) {
+					// 필터교환 팝업
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.FilterReset);
+				}
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.BATHROOM) {
+				//욕실 배기
+				printDebugLog("onTouchEvent [BATHROOM] BUTTON !!!");
+
+				// 9. 욕실 배기
+				if(Support.BathRoom) {
+					WallpadStatusData wd = new WallpadStatusData(this.getContext());
+					String ret = wd.GetWallPADData(WallpadStatusData.VENTI_BATHROOM);
+
+					if (ret.equalsIgnoreCase("true") == true) {
+						wd.UpdateWallPADData(WallpadStatusData.VENTI_BATHROOM, "false");
+						BTN_BATHROOM.setButtonFrontImage();
+					}
+					else {
+						wd.UpdateWallPADData(WallpadStatusData.VENTI_BATHROOM, "true");
+						BTN_BATHROOM.setButtonRearImage();
+					}
+					wd.closeDB();
+
+					if (OnOff == true) {
+						//제어
+						int ret2 = ctrlDevicePower(OnOff);
+						if (ret2 >= 0) Sound().Play(SND.effect.TOUCH_LATCHED);
+						else Sound().Play(SND.effect.TOUCH_UNLATCHED);
+					}
+					else {
+						Sound().Play(SND.effect.TOUCH_LATCHED);
+					}
+				}
+			}
+			/**
+			* 환기케어서비스 버튼
+			* @author 신범식
+			* @since
+			**/
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.FILLTER_SERVICE) {
+				//StartAlarmPopup(ID.VentiPopup_Alarm.kind.FilterService);
+
+				// 환기 케어 서비스
+				printDebugLog("onTouchEvent [FILLTER_SERVICE] BUTTON !!!");
+				Sound().Play(SND.effect.TOUCH_LATCHED);
+				((MainActivity)(getContext())).StartPopup(ID.screen.VentiPopupServiceScreen);
+			}
+			else if ((nTargetID >= ID.VentilationMainScreenID.BTN.ROOM_ONOFF_1) && (nTargetID <= ID.VentilationMainScreenID.BTN.ROOM_ONOFF_8)) {
+
+				if(!OnOff ) return;
+				if(!room_vanti) return;
+				Sound().Play(SND.effect.TOUCH_LATCHED);
+				int id = nTargetID - ID.VentilationMainScreenID.BTN.ROOM_ONOFF_1;
+				int status;
+				switch (id)
+				{
+					case 0:
+						status = 0;
+						break;
+					case 1:
+						status = 3;
+						break;
+					case 2:
+						status = 2;
+						break;
+					case 3:
+						status = 1;
+						break;
+					default:
+						status = 0;
+						break;
+				}
+				roomView[id].setStatus(roomView[id].getOnOff(), status);
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_VENTILATION) {
+				//StartAlarmPopup(ID.VentiPopup_Alarm.kind.FilterService);
+				room_vanti = !room_vanti;
+				// 환기 케어 서비스
+				printDebugLog("onTouchEvent [ONOFF_VENTILATION] BUTTON !!!");
+				Sound().Play(SND.effect.TOUCH_LATCHED);
+				SetRoomVentiOnOff(room_vanti);
+			}
+			else if (nTargetID == ID.VentilationMainScreenID.BTN.ONOFF_SANITIZATION) {
+				//StartAlarmPopup(ID.VentiPopup_Alarm.kind.FilterService);
+				sanitiztion = !sanitiztion;
+				// 환기 케어 서비스
+				printDebugLog("onTouchEvent [ONOFF_SANITIZATION] BUTTON !!!");
+				Sound().Play(SND.effect.TOUCH_LATCHED);
+				SetSanitiztion(sanitiztion);
+			}
+		}
+		else if (nMoveEvent == MotionEvent.ACTION_POINTER_DOWN) {
+			if (nTargetID == ID.VentilationMainScreenID.IMG.BACKGROUND_SUB) {
+				// 필터교환 팝업 히든 버튼 (환기케어 서비스 담당자용)
+				if (Support.FilterReset) {
+					// 필터교환 팝업
+					startAlarmPopup(ID.VentiPopup_Alarm.kind.FilterReset);
+				}
+			}
+		}
+	}
+
+	/**
+	 * 알람팝업을 실행시킨다.
+	 *
+	 * @param kind - (int) 팝업 종류 : 예약중       ID.VentiPopup_Alarm.kind.ReservationClear<br>
+	 *                                히터 알람  ID.VentiPopup_Alarm.kind.HeaterOn<br>
+	 *                                필터교환   ID.VentiPopup_Alarm.kind.FilterReset<br>
+	 *                                안전모드   ID.VentiPopup_Alarm.kind.SafeMode<br>
+	 *
+	 * @return (boolean) true : 성공, false : 실패
+	 */
+	private boolean startAlarmPopup(int kind) {
+		boolean bRet = false;
+		Intent data = null;
+		if (kind == ID.VentiPopup_Alarm.kind.ReservationClear) {
+			// 예약중입니다 팝업 알람
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "예약 운전이 동작중입니다.");
+			data.putExtra("TEXT2", "예약 운전을 정지 하시겠습니까?");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.HeaterOn) {
+			// 히터알람 팝업
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "히터 기능 선택시 시간당 약 400Wh 의");
+			data.putExtra("TEXT2", "전기 요금이 추가 됩니다.");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.FilterReset) {
+			// 필터교환 팝업
+			if (bVentilCareService) {
+				// 신규
+				data = new Intent();
+				data.putExtra("KIND", kind);
+				data.putExtra("IMAGE_ID", R.drawable.control_venti_popup_qr);
+				data.putExtra("TEXT1", "필터교체 시기가 되었습니다.");
+				data.putExtra("TEXT2", "이를 초기화 시키겠습니까?");
+				data.putExtra("TEXT3", "환기 케어 서비스(필터교환)");
+				data.putExtra("TEXT4", "1811-2770");
+				data.putExtra("BTN_COUNT", 2);
+				data.putExtra("EXTEND_TYPE", "Y");
+			}
+			else {
+				// 기존
+				data = new Intent();
+				data.putExtra("KIND", kind);
+				data.putExtra("IMAGE_ID", R.drawable.control_venti_popup_image);
+				data.putExtra("TEXT1", "필터교체 시기가 되었습니다.");
+				data.putExtra("TEXT2", "이를 초기화 시키겠습니까?");
+				data.putExtra("BTN_COUNT", 2);
+			}
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.SafeMode) {
+			// 안전모드 팝업
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "영하 -10℃ 이하에서는 장비 손상의");
+			data.putExtra("TEXT2", "우려가 있어 구동을 멈춥니다.");
+			data.putExtra("BTN_COUNT", 1);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.HDCAutoAirCleanOn) {
+			// 자동운전 팝업 (ON)
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "실내의 공기오염정도에 따라 자동운전되며");
+			data.putExtra("TEXT2", "24시간후 자동 OFF 됩니다.");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.CancelHDCAutoAirCleanNRunReservation) {
+			// 현산 지능형 환기 자동청정 기능
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "자동 청정 기능이 동작중입니다.");
+			data.putExtra("TEXT2", "취소하고 예약 운전을 실행하시겠습니까?");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.CancelReservationNRunAutoAirClean) {
+			// 환기 예약운전 Off, 현산 지능형 환기 자동청정 On
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "예약 운전이 동작중입니다.");
+			data.putExtra("TEXT2", "취소하고 자동 청정을 실행하시겠습니까?");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.AirQualityFanWarning) {
+			// 공기질 센서 동작 확인
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "공기질 센서의 팬이 동작 중일 때만 가능합니다.");
+			data.putExtra("TEXT2", "팬을 동작시키시겠습니까?");
+			data.putExtra("BTN_COUNT", 2);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.TurnOnVentilPower) {
+			// 환기 전원 On 요청
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "환기장비의 전원을 On 시켜주세요.");
+			data.putExtra("TEXT2", "해당기능은 전원이 On인 상태에서 가능합니다.");
+			data.putExtra("BTN_COUNT", 1);
+		}
+		else if (kind == ID.VentiPopup_Alarm.kind.DeviceError) {
+			// 환기장비 이상
+			data = new Intent();
+			data.putExtra("KIND", kind);
+			data.putExtra("IMAGE_ID", R.drawable.ventipopup_alarm);
+			data.putExtra("TEXT1", "환기장비에 장애가 발생하였습니다.");
+			data.putExtra("TEXT2", "환기장비 업체에 문의하세요.");
+			data.putExtra("TEXT3", "E04: 모터, E08: 온도센서");
+			data.putExtra("TEXT4", "E20: 급기팬, E40: 배기팬");
+			data.putExtra("BTN_COUNT", 1);
+			data.putExtra("EXTEND_TYPE", "Y");
+		}
+		else {
+			Log.w(TAG, "[StartAlarmPopup] Param : kind - Out Of Range !!! (kind:" + kind + ")");
+			return false;
+		}
+
+		if (data != null) {
+			bRet = ((MainActivity)(getContext())).StartPopup(ID.screen.VentiPopupAlarmScreen, data);
+			if (bRet) {
+				Sound().Play(SND.effect.WARNING005);
+			}
+			else {
+				Log.w(TAG, "[StartAlarmPopup] StartPopup return false !!!");
+			}
+		}
+		return bRet;
+	}
+
+	// =================================================================================================
+	// [[ Draw ]] region
+	// =================================================================================================
+	/**
+	 * 변경되는 이미지를 다시 그린다.
+	 */
+	private void updateScreen() {
+		try {
+			Log.i(TAG, "[updateScreen] OnOff [" + OnOff + "], Wind [" + Wind + "]");
+			// 환기 에러 확인
+			checkVentilatorError();
+
+			// 환기 동작 상태 표시
+			drawInstructionInfo();
+
+			// On/Off 스위치 상태 표시
+			drawSwitch();
+
+			// 환기 동작 모드 상태 표시
+			drawVentilMode();
+
+			// 3. 풍량
+			if (OnOff) {
+				drawWind(Wind);
+				drawAirFlowAnim(Wind);
+			}
+			else {
+				drawWind((byte)0x00);
+				drawAirFlowAnim((byte)0x00);
+			}
+
+			// 4. 타이머
+			drawTimer(Timer);
+
+			// 5. 필터교환
+			if (Fault.FilterChangeMedium || Fault.FilterChangeFree) {
+				if (!mFilterChangeHandlerRun) {
+					mFilterChangeHandler.sendEmptyMessage(1);
+				}
+			}
+			else {
+				if (mFilterChangeHandlerRun) {
+					mFilterChangeHandler.removeMessages(1);
+					mFilterChangeHandler.removeMessages(2);
+					mFilterChangeHandler.sendEmptyMessage(0);
+				}
+			}
+
+//			ToDebugString();
+//			ToFaultString();
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] updateScreen())");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	private void drawSwitch() {
+		try {
+			// 전원 ON/OFF
+			if (OnOff) drawPower(true);
+			else drawPower(false);
+
+			// 예약운전 ON/OFF
+			if (Reservation) drawReservation(true);
+			else drawReservation(false);
+
+			// 자동청정 ON/OFF
+			if (bAirQualitySensorUsage) {
+				if (HDCAutoAirClean) drawAutoClean(true);
+				else drawAutoClean(false);
+			}
+
+			// 자동운전 ON/OFF
+			if (Support.AutoDriving) {
+				if (AutoDriving) drawAutoDriving(true);
+				else drawAutoDriving(false);
+			}
+
+			// 히터 ON/OFF
+			if (Support.Heater) {
+				if (ByPass) {
+					BTN_ONOFF_HEATER.setButtonEventOffEnable();
+				}
+				else {
+					BTN_ONOFF_HEATER.setButtonEventOffDisable();
+					if (OnOff) {
+						if (HeaterStatus == Venti.HEATER.STAND_BY || HeaterStatus == Venti.HEATER.ON) drawHeater(true);
+						else drawHeater(false);
+					}
+					else {
+						BTN_ONOFF_HEATER.setButtonEventOffEnable();
+					}
+				}
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawSwitch()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	private void drawVentilMode() {
+		try {
+			if (OnOff && (HDCAutoAirClean || AutoDriving)) {
+				// 현산 자동청정/자동운전 기능 동작중
+				if (OutAirClean) {
+					// 외기청정 모드
+					if (BTN_VENTILMODE_NORMAL != null) BTN_VENTILMODE_NORMAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_normal_normaldisabled);
+					if (BTN_VENTILMODE_NATURAL != null) {
+						if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_bypass_normaldisabled);
+						else BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_natural_normaldisabled);
+					}
+					if (BTN_VENTILMODE_INTERNALCIRCUL != null) BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_internal_normaldisabled);
+					if (BTN_VENTILMODE_EXTERNALAIRCLEAN != null) BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_externalclean_selecteddisabled);
+				}
+				else if (InnerCycle) {
+					// 내부순환 모드
+					if (BTN_VENTILMODE_NORMAL != null) BTN_VENTILMODE_NORMAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_normal_normaldisabled);
+					if (BTN_VENTILMODE_NATURAL != null) {
+						if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_bypass_normaldisabled);
+						BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_natural_normaldisabled);
+					}
+					if (BTN_VENTILMODE_INTERNALCIRCUL != null) BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_internal_selecteddisabled);
+					if (BTN_VENTILMODE_EXTERNALAIRCLEAN != null) BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_externalclean_normaldisabled);
+				}
+				else if (ByPass) {
+					// 자연환기 모드
+					if (BTN_VENTILMODE_NORMAL != null) BTN_VENTILMODE_NORMAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_normal_normaldisabled);
+					if (BTN_VENTILMODE_NATURAL != null) {
+						if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_bypass_selecteddisabled);
+						BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_natural_selecteddisabled);
+					}
+					if (BTN_VENTILMODE_INTERNALCIRCUL != null) BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_internal_normaldisabled);
+					if (BTN_VENTILMODE_EXTERNALAIRCLEAN != null) BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_externalclean_normaldisabled);
+				}
+				else {
+					// 일반환기 모드
+					if (BTN_VENTILMODE_NORMAL != null) BTN_VENTILMODE_NORMAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_normal_selecteddisabled);
+					if (BTN_VENTILMODE_NATURAL != null) {
+						if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_bypass_normaldisabled);
+						else BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_natural_normaldisabled);
+					}
+					if (BTN_VENTILMODE_INTERNALCIRCUL != null) BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_internal_normaldisabled);
+					if (BTN_VENTILMODE_EXTERNALAIRCLEAN != null) BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_externalclean_normaldisabled);
+				}
+			}
+			else {
+				// 현산 자동청정/자동운전 기능 미동작중
+				if (Support.ByPass || Support.InnerCycle || Support.OutAirClean || Support.AutoDriving) {
+					// 일반환기 모드 외에 다른 환기 모드가 존재하는 경우, 다른 환기 모드가 꺼진경우 일반환기로 판단
+					if (OnOff) {
+						if (!ByPass && !InnerCycle && !OutAirClean && !AutoDriving) {
+							// 일반환기 모드 동작중
+							if (BTN_VENTILMODE_NORMAL != null) {
+								BTN_VENTILMODE_NORMAL.setButtonEventOffEnable();
+								BTN_VENTILMODE_NORMAL.setButtonRearImage();
+							}
+						}
+						else {
+							// 다른 환기 모드 동작중
+							if (BTN_VENTILMODE_NORMAL != null) {
+								BTN_VENTILMODE_NORMAL.setButtonEventOffDisable();
+								BTN_VENTILMODE_NORMAL.setButtonFrontImage();
+							}
+						}
+					}
+					else {
+						BTN_VENTILMODE_NORMAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_normal_normaldisabled);    // Disable
+					}
+				}
+				else {
+					//  일반환기만 지원하는 경우
+					if (OnOff) {
+						if (BTN_VENTILMODE_NORMAL != null) {
+							BTN_VENTILMODE_NORMAL.setButtonEventOffEnable();
+							BTN_VENTILMODE_NORMAL.setButtonRearImage();
+						}
+					}
+					else {
+						if (BTN_VENTILMODE_NORMAL != null) {
+							BTN_VENTILMODE_NORMAL.setButtonEventOffDisable();
+							BTN_VENTILMODE_NORMAL.setButtonFrontImage();
+						}
+					}
+				}
+
+				// 자연환기 모드
+				if (Support.ByPass) {
+					if (OnOff) {
+						if (ByPass) {
+							BTN_VENTILMODE_NATURAL.setButtonEventOffEnable();
+							BTN_VENTILMODE_NATURAL.setButtonRearImage();
+						}
+						else {
+							BTN_VENTILMODE_NATURAL.setButtonEventOffDisable();
+							BTN_VENTILMODE_NATURAL.setButtonFrontImage();
+						}
+					}
+					else {
+						if (MainActivity.nConstructionFunction == WallpadDeviceSet.CONSTRUCTION_SPECIAL_FUNCTION_SK) BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_bypass_normaldisabled);    // Disable
+						else BTN_VENTILMODE_NATURAL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_natural_normaldisabled);    // Disable
+					}
+				}
+
+				// 내부순환 모드
+				if (Support.InnerCycle) {
+					if (OnOff) {
+						if (InnerCycle) {
+							BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable();
+							BTN_VENTILMODE_INTERNALCIRCUL.setButtonRearImage();
+						}
+						else {
+							BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffDisable();
+							BTN_VENTILMODE_INTERNALCIRCUL.setButtonFrontImage();
+						}
+					}
+					else {
+						BTN_VENTILMODE_INTERNALCIRCUL.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_internal_normaldisabled);    // Disable
+					}
+				}
+
+				// 외기청정 모드
+				if (Support.OutAirClean) {
+					if (OnOff) {
+						if (OutAirClean) {
+							BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable();
+							BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonRearImage();
+						}
+						else {
+							BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffDisable();
+							BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonFrontImage();
+						}
+					}
+					else {
+						BTN_VENTILMODE_EXTERNALAIRCLEAN.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_mode_externalclean_normaldisabled);    // Disable
+					}
+				}
+			}
+
+			// 취침 모드
+			if (Support2.SleepMode) {
+				if (OnOff) {
+					if (Sleep == Venti.SLEEP.SLEEP_ON) {
+						BTN_VENTILMODE_SLEEP.setButtonEventOffDisable();
+						BTN_VENTILMODE_SLEEP.setButtonRearImage();
+					}
+					else {
+						BTN_VENTILMODE_SLEEP.setButtonEventOffEnable();
+						BTN_VENTILMODE_SLEEP.setButtonFrontImage();
+					}
+				}
+				else {
+					BTN_VENTILMODE_SLEEP.setButtonEventOffEnable();
+//					BTN_VENTILMODE_SLEEP.setButtonEventOffEnable(R.drawable.control_venti_btn_off_normal);    // Disable
+				}
+			}
+
+			// 자동운전 모드
+			if (Support.AutoDriving && BTN_VENTILMODE_AUTO!=null) {
+				// [예약운전 & 창호환기 아닌경우] 또는 [타이머운전] 또는 [운전OFF중에 자동운전OFF일시] 자동운전 비활성화
+				if ((Reservation && !Support2.WindowVenti) || (Timer != 0)  || (!OnOff && !AutoDriving)) {
+
+						BTN_VENTILMODE_AUTO.setButtonEventOffEnable();
+//					BTN_VENTILMODE_AUTO.setButtonEventOffEnable(R.drawable.control_venti_btn_off_normal);    // Disable
+				}
+				// 아닐시
+				// [타이머:OFF] [예약운전:OFF] [운전:ON]  [자동운전:OFF] - 켜기 활성화
+				//
+				// [타이머:OFF] [예약운전:OFF] [운전:OFF] [자동운전:ON ] - 끄기 활성화
+				// [타이머:OFF] [예약운전:OFF] [운전:ON ] [자동운전:ON ] - 끄기 활성화
+				else {
+					if (AutoDriving) {
+						// 끄기 활성화
+						BTN_VENTILMODE_AUTO.setButtonEventOffDisable();
+						BTN_VENTILMODE_AUTO.setButtonRearImage();
+					}
+					else {
+						// 켜기 활성화
+						BTN_VENTILMODE_AUTO.setButtonEventOffDisable();
+						BTN_VENTILMODE_AUTO.setButtonFrontImage();
+					}
+				}
+			}
+
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawVentilMode()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	String strErrorCodeHeader = "Error code: ";
+	String strErrorCode_MotorError = "E04";   // 모터이상
+	String strErrorCode_TempSensorError = "E08";   // 온도센서 이상
+	String strErrorCode_SupplyFanError = "E20";   // 급기팬 이상
+	String strErrorCode_ExhaustFanError = "E40";   // 배기팬 이상
+	private void checkVentilatorError() {
+		try {
+			Log.i(TAG, "[checkVentilatorError]");
+			if (mVentilData == null) {
+				Log.w(TAG, "[checkVentilatorError] mVentilData is null!!");
+				return;
+			}
+
+			if (mVentilData.VentilStatus == null) {
+				Log.w(TAG, "[checkVentilatorError] mVentilData.VentilStatus is null!!");
+				return;
+			}
+
+			if (Fault == null) {
+				Log.w(TAG, "[checkVentilatorError] Fault is null!!");
+				return;
+			}
+
+			String strAlarmMessage = "";
+
+			if (Fault.MotorError) {
+				if (strAlarmMessage.equalsIgnoreCase("")) strAlarmMessage += strErrorCodeHeader + strErrorCode_MotorError;
+			}
+
+			if (Fault.TempSensorError) {
+				if (strAlarmMessage.equalsIgnoreCase("")) strAlarmMessage += strErrorCodeHeader + strErrorCode_TempSensorError;
+				else strAlarmMessage += ", " + strErrorCode_TempSensorError;
+			}
+
+			if (Fault.SupplyFanError) {
+				if (strAlarmMessage.equalsIgnoreCase("")) strAlarmMessage += strErrorCodeHeader + strErrorCode_SupplyFanError;
+				else strAlarmMessage += ", " + strErrorCode_SupplyFanError;
+			}
+
+			if (Fault.ExhaustFanError) {
+				if (strAlarmMessage.equalsIgnoreCase("")) strAlarmMessage += strErrorCodeHeader + strErrorCode_ExhaustFanError;
+				else strAlarmMessage += ", " + strErrorCode_ExhaustFanError;
+			}
+
+			if (strAlarmMessage.equalsIgnoreCase("")) TXT_ALARM_MESSAGE.setVisibility(View.INVISIBLE);
+			else TXT_ALARM_MESSAGE.setVisibility(View.VISIBLE);
+
+			Log.w(TAG, "[checkVentilatorError] strAlarmMessage [" + strAlarmMessage + "]");
+
+			TXT_ALARM_MESSAGE.setText(strAlarmMessage);
+
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] checkVentilatorError()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+
+	static class AIRITEM {
+		static int PM10 = 1;   //  미세먼지 (PM10㎛ 이하)
+		static int PM2p5 = 2;   // 초미세먼지 (PM2.5㎛ 이하)
+		static int CO2 = 3;   // 이산화탄소 농도
+	}
+	private int AirQualityStep = 0;   // 공기질 단계 (4: 4단계, 8: 8단계)
+
+	private void registerAirQualityFragment(Context context, RelativeLayout layout) {
+		try {
+			// 미세먼지
+			TXT_AIRQUALITY_TITLE_PM10 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_TITLE_PM10);
+			ViewRegistration(layout, TXT_AIRQUALITY_TITLE_PM10, Common.ImgPosion.GetX(144), Common.ImgPosion.GetY(595));
+			TXT_AIRQUALITY_TITLE_PM10.setText("미세");
+//			TXT_AIRQUALITY_TITLE_PM10.setBackgroundColor(Color.RED);
+
+			IMG_AIRQUALITY_STATUS_PM10 = new WpadImageView(context, TOUCH_KIND.NONE, 82, 82, R.drawable.ctrl_ventil_icon_air_status_4step_02 , 0, ID.VentilationMainScreenID.IMG.AIRQUALITY_STATUS_PM10);
+			ViewRegistration(layout, IMG_AIRQUALITY_STATUS_PM10, Common.ImgPosion.GetX(153), Common.ImgPosion.GetY(633));
+
+			TXT_AIRQUALITY_STATUS_PM10 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_STATUS_PM10);
+			ViewRegistration(layout, TXT_AIRQUALITY_STATUS_PM10, Common.ImgPosion.GetX(144), Common.ImgPosion.GetY(719));
+			TXT_AIRQUALITY_STATUS_PM10.setText("보통");
+//			TXT_AIRQUALITY_STATUS_PM10.setBackgroundColor(Color.RED);
+
+			if (bAirQualityFigureSupport) {
+				TXT_AIRQUALITY_FIGURE_PM10 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_FIGURE_PM10);
+				ViewRegistration(layout, TXT_AIRQUALITY_FIGURE_PM10, Common.ImgPosion.GetX(244), Common.ImgPosion.GetY(595));
+				TXT_AIRQUALITY_FIGURE_PM10.setText("50");
+			}
+
+			// 초미세먼지 부분 추가
+			TXT_AIRQUALITY_TITLE_PM2p5 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_TITLE_PM2p5);
+			ViewRegistration(layout, TXT_AIRQUALITY_TITLE_PM2p5, Common.ImgPosion.GetX(294), Common.ImgPosion.GetY(595));
+			TXT_AIRQUALITY_TITLE_PM2p5.setText("초미세");
+//			TXT_AIRQUALITY_TITLE_PM2p5.setBackgroundColor(Color.RED);
+
+			IMG_AIRQUALITY_STATUS_PM2p5 = new WpadImageView(context, TOUCH_KIND.NONE, 82, 82, R.drawable.ctrl_ventil_icon_air_status_4step_02 , 0, ID.VentilationMainScreenID.IMG.AIRQUALITY_STATUS_PM2p5);
+			ViewRegistration(layout, IMG_AIRQUALITY_STATUS_PM2p5, Common.ImgPosion.GetX(303), Common.ImgPosion.GetY(633));
+
+			TXT_AIRQUALITY_STATUS_PM2p5 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_STATUS_PM2p5);
+			ViewRegistration(layout, TXT_AIRQUALITY_STATUS_PM2p5, Common.ImgPosion.GetX(294), Common.ImgPosion.GetY(719));
+			TXT_AIRQUALITY_STATUS_PM2p5.setText("보통");
+//			TXT_AIRQUALITY_STATUS_PM2p5.setBackgroundColor(Color.RED);
+
+			if (bAirQualityFigureSupport) {
+				TXT_AIRQUALITY_FIGURE_PM2p5 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_FIGURE_PM2p5);
+				ViewRegistration(layout, TXT_AIRQUALITY_FIGURE_PM2p5, Common.ImgPosion.GetX(394), Common.ImgPosion.GetY(595));
+				TXT_AIRQUALITY_FIGURE_PM2p5.setText("50");
+			}
+
+			// CO2 부분 추가
+			TXT_AIRQUALITY_TITLE_CO2 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_TITLE_CO2);
+			ViewRegistration(layout, TXT_AIRQUALITY_TITLE_CO2, Common.ImgPosion.GetX(444), Common.ImgPosion.GetY(595));
+			TXT_AIRQUALITY_TITLE_CO2.setText("CO2");
+//			TXT_AIRQUALITY_TITLE_CO2.setBackgroundColor(Color.RED);
+
+			IMG_AIRQUALITY_STATUS_CO2 = new WpadImageView(context, TOUCH_KIND.NONE, 82, 82, R.drawable.ctrl_ventil_icon_air_status_4step_02 , 0, ID.VentilationMainScreenID.IMG.AIRQUALITY_STATUS_CO2);
+			ViewRegistration(layout, IMG_AIRQUALITY_STATUS_CO2, Common.ImgPosion.GetX(453), Common.ImgPosion.GetY(633));
+
+			TXT_AIRQUALITY_STATUS_CO2 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_STATUS_CO2);
+			ViewRegistration(layout, TXT_AIRQUALITY_STATUS_CO2, Common.ImgPosion.GetX(444), Common.ImgPosion.GetY(719));
+			TXT_AIRQUALITY_STATUS_CO2.setText("보통");
+//			TXT_AIRQUALITY_STATUS_CO2.setBackgroundColor(Color.RED);
+
+			if (bAirQualityFigureSupport) {
+				TXT_AIRQUALITY_FIGURE_CO2 = new WpadTextView(context, false, 100, 36, Gravity.CENTER, Color.WHITE, Common.fontsize._24, true, ID.VentilationMainScreenID.TXT.AIRQUALITY_FIGURE_CO2);
+				ViewRegistration(layout, TXT_AIRQUALITY_FIGURE_CO2, Common.ImgPosion.GetX(544), Common.ImgPosion.GetY(595));
+				TXT_AIRQUALITY_FIGURE_CO2.setText("50");
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] registerAirQualityFragment(Context context, RelativeLayout layout)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	public void updateAirQualityFragment() {
+		try {
+			// 미세먼지
+			drawAirQualityImage(AIRITEM.PM10, mAirQualityData.device.hLevel_PM10);
+			drawAirQualityText(AIRITEM.PM10, mAirQualityData.device.hLevel_PM10);
+			if (bAirQualityFigureSupport) drawAirQualityFigure(AIRITEM.PM10, mAirQualityData.device.dFigure_PM10);
+
+			// 초미세먼지
+			drawAirQualityImage(AIRITEM.PM2p5, mAirQualityData.device.hLevel_PM2p5);
+			drawAirQualityText(AIRITEM.PM2p5, mAirQualityData.device.hLevel_PM2p5);
+			if (bAirQualityFigureSupport) drawAirQualityFigure(AIRITEM.PM2p5, mAirQualityData.device.dFigure_PM2p5);
+
+			// 이산화탄소
+			drawAirQualityImage(AIRITEM.CO2, mAirQualityData.device.hLevel_CO2);
+			drawAirQualityText(AIRITEM.CO2, mAirQualityData.device.hLevel_CO2);
+			if (bAirQualityFigureSupport) drawAirQualityFigure(AIRITEM.CO2, mAirQualityData.device.dFigure_CO2);
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] updateAirQualityFragment()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 공기질 단계별로 이미지를 교체한다
+	 *
+	 * @param nType 공기질 타입(미세, 초미세, CO2)
+	 * @param hLevel 단계(좋음 ~ 최악)
+	 */
+	public void drawAirQualityImage(int nType, byte hLevel) {
+		try {
+			if (nType < AIRITEM.PM10 || AIRITEM.CO2 < nType) {
+				Log.w(TAG, "[drawAirQualityImage] nType is out of range!!! -> " + nType);
+				return;
+			}
+
+			if ((IMG_AIRQUALITY_STATUS_PM10 == null) || (IMG_AIRQUALITY_STATUS_PM2p5 == null) || (IMG_AIRQUALITY_STATUS_CO2 == null) ) return;
+
+			if (AirQualityStep == 4) {
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL4.PM10.GOOD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.NORMAL) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.BAD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.WORSE) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL4.PM2_5.GOOD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.NORMAL) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.BAD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.WORSE) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL4.CO2.GOOD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.NORMAL) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.BAD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.WORSE) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+			}
+			else if (AirQualityStep == 8) {
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL8.PM10.BEST) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_best);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.GOOD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_good);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.FINE) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_fine);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.NORMAL) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_normal);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.BAD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_bad);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.QUITEBAD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_quite_bad);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.WORSE) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_worse);
+					else if (hLevel == AIRLevel.LEVEL8.PM10.WORST) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_worst);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.air_quality8_worst);
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL8.PM2_5.BEST) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_best);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.GOOD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_good);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.FINE) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_fine);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.NORMAL) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_normal);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.BAD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_bad);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.QUITEBAD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_quite_bad);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.WORSE) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_worse);
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.WORST) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_worst);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.air_quality8_worst);
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL8.CO2.BEST) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_best);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.GOOD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_good);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.FINE) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_fine);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.NORMAL) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_normal);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.BAD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_bad);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.QUITEBAD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_quite_bad);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.WORSE) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_worse);
+					else if (hLevel == AIRLevel.LEVEL8.CO2.WORST) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_worst);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.air_quality8_worst);
+				}
+			}
+			else {
+				// 기본 4단계로 그리도록 함
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL4.PM10.GOOD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.NORMAL) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.BAD) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.PM10.WORSE) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM10.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL4.PM2_5.GOOD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.NORMAL) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.BAD) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.WORSE) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_PM2p5.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL4.CO2.GOOD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.NORMAL) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_02);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.BAD) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_03);
+					else if (hLevel == AIRLevel.LEVEL4.CO2.WORSE) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_04);
+					else if (hLevel == (byte) 0xFF) IMG_AIRQUALITY_STATUS_CO2.setImageResource(R.drawable.ctrl_ventil_icon_air_status_4step_01);
+				}
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAirQualityImage(int nType, byte hLevel)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 공기질 항목별로 단계를 표기한다.
+	 *
+	 * @param nType
+	 * @param hLevel
+	 */
+	public void drawAirQualityText(int nType, byte hLevel) {
+		try {
+			if (nType < AIRITEM.PM10 || AIRITEM.CO2 < nType) {
+				Log.w(TAG, "[drawAirQualityText] nType is out of range!!! -> " + nType);
+				return;
+			}
+
+			if ((TXT_AIRQUALITY_STATUS_PM10 == null) || (TXT_AIRQUALITY_STATUS_PM2p5 == null) || (TXT_AIRQUALITY_STATUS_CO2 == null)) return;
+
+			if (AirQualityStep == 4) {
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL4.PM10.GOOD) TXT_AIRQUALITY_STATUS_PM10.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.NORMAL) TXT_AIRQUALITY_STATUS_PM10.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.BAD) TXT_AIRQUALITY_STATUS_PM10.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.WORSE) TXT_AIRQUALITY_STATUS_PM10.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM10.setText("지원안함");
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL4.PM2_5.GOOD) TXT_AIRQUALITY_STATUS_PM2p5.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.NORMAL) TXT_AIRQUALITY_STATUS_PM2p5.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.BAD) TXT_AIRQUALITY_STATUS_PM2p5.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.WORSE) TXT_AIRQUALITY_STATUS_PM2p5.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM2p5.setText("지원안함");
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL4.CO2.GOOD) TXT_AIRQUALITY_STATUS_CO2.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.NORMAL) TXT_AIRQUALITY_STATUS_CO2.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.BAD) TXT_AIRQUALITY_STATUS_CO2.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.WORSE) TXT_AIRQUALITY_STATUS_CO2.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_CO2.setText("지원안함");
+				}
+			}
+			else if (AirQualityStep == 8) {
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL8.PM10.BEST) TXT_AIRQUALITY_STATUS_PM10.setText("최고좋음");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.GOOD) TXT_AIRQUALITY_STATUS_PM10.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.FINE) TXT_AIRQUALITY_STATUS_PM10.setText("양호");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.NORMAL) TXT_AIRQUALITY_STATUS_PM10.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.BAD) TXT_AIRQUALITY_STATUS_PM10.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.QUITEBAD) TXT_AIRQUALITY_STATUS_PM10.setText("상당히 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.WORSE) TXT_AIRQUALITY_STATUS_PM10.setText("매우 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM10.WORST) TXT_AIRQUALITY_STATUS_PM10.setText("최악");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM10.setText("지원안함");
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL8.PM2_5.BEST) TXT_AIRQUALITY_STATUS_PM2p5.setText("아주좋음");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.GOOD) TXT_AIRQUALITY_STATUS_PM2p5.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.FINE) TXT_AIRQUALITY_STATUS_PM2p5.setText("양호");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.NORMAL) TXT_AIRQUALITY_STATUS_PM2p5.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.BAD) TXT_AIRQUALITY_STATUS_PM2p5.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.QUITEBAD) TXT_AIRQUALITY_STATUS_PM2p5.setText("상당히 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.WORSE) TXT_AIRQUALITY_STATUS_PM2p5.setText("매우 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.PM2_5.WORST) TXT_AIRQUALITY_STATUS_PM2p5.setText("최악");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM2p5.setText("지원안함");
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL8.CO2.BEST) TXT_AIRQUALITY_STATUS_CO2.setText("아주좋음");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.GOOD) TXT_AIRQUALITY_STATUS_CO2.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.FINE) TXT_AIRQUALITY_STATUS_CO2.setText("양호");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.NORMAL) TXT_AIRQUALITY_STATUS_CO2.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.BAD) TXT_AIRQUALITY_STATUS_CO2.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.QUITEBAD) TXT_AIRQUALITY_STATUS_CO2.setText("상당히 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.WORSE) TXT_AIRQUALITY_STATUS_CO2.setText("매우 나쁨");
+					else if (hLevel == AIRLevel.LEVEL8.CO2.WORST) TXT_AIRQUALITY_STATUS_CO2.setText("최악");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_CO2.setText("지원안함");
+				}
+			}
+			else {
+				// 기본 4단계로 그리도록 함
+				if (nType == AIRITEM.PM10) {
+					if (hLevel == AIRLevel.LEVEL4.PM10.GOOD) TXT_AIRQUALITY_STATUS_PM10.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.NORMAL) TXT_AIRQUALITY_STATUS_PM10.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.BAD) TXT_AIRQUALITY_STATUS_PM10.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.PM10.WORSE) TXT_AIRQUALITY_STATUS_PM10.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM10.setText("지원안함");
+				}
+				else if (nType == AIRITEM.PM2p5) {
+					if (hLevel == AIRLevel.LEVEL4.PM2_5.GOOD) TXT_AIRQUALITY_STATUS_PM2p5.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.NORMAL) TXT_AIRQUALITY_STATUS_PM2p5.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.BAD) TXT_AIRQUALITY_STATUS_PM2p5.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.PM2_5.WORSE) TXT_AIRQUALITY_STATUS_PM2p5.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_PM2p5.setText("지원안함");
+				}
+				else if (nType == AIRITEM.CO2) {
+					if (hLevel == AIRLevel.LEVEL4.CO2.GOOD) TXT_AIRQUALITY_STATUS_CO2.setText("좋음");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.NORMAL) TXT_AIRQUALITY_STATUS_CO2.setText("보통");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.BAD) TXT_AIRQUALITY_STATUS_CO2.setText("나쁨");
+					else if (hLevel == AIRLevel.LEVEL4.CO2.WORSE) TXT_AIRQUALITY_STATUS_CO2.setText("매우 나쁨");
+					else if (hLevel == (byte) 0xFF) TXT_AIRQUALITY_STATUS_CO2.setText("지원안함");
+				}
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAirQualityText(int nType, byte hLevel)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 공기질 항목별로 센서값을 표기한다.
+	 *
+	 * @param nType
+	 * @param dFigure
+	 */
+	public void drawAirQualityFigure(int nType, double dFigure) {
+		try {
+			if (nType < AIRITEM.PM10 || AIRITEM.CO2 < nType) {
+				Log.w(TAG, "[drawAirQualityFigure] nType is out of range!!! -> " + nType);
+				return;
+			}
+
+			if ((TXT_AIRQUALITY_FIGURE_PM10 == null) || (TXT_AIRQUALITY_FIGURE_PM2p5 == null) || (TXT_AIRQUALITY_FIGURE_CO2 == null)) return;
+
+			String strFigure = "";
+			strFigure = String.format("%.0f", dFigure);
+
+			if (nType == AIRITEM.PM10) TXT_AIRQUALITY_FIGURE_PM10.setText(strFigure + "㎍/m³");
+			else if (nType == AIRITEM.PM2p5) TXT_AIRQUALITY_FIGURE_PM2p5.setText(strFigure + "㎍/m³");
+			else if (nType == AIRITEM.CO2) TXT_AIRQUALITY_FIGURE_CO2.setText(strFigure+"ppm");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAirQualityFigure(int nType, double dFigure)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+
+
+
+
+
+
+
+
+	/**
+	 * 풍량에 따른 환기 에니메이션 효과 적용
+	 *
+	 * @param hWind - 변경할 풍량 (VentiAPI.WIND.LOW, VentiAPI.WIND.MID, VentiAPI.WIND.HI)
+	 */
+	private void drawAirFlowAnim(byte hWind) {
+		try {
+			Log.i(TAG, "[drawAirFlowAnim] hWind [0x" + String.format("%02X", hWind) + "]");
+			if (!OnOff) {
+				hVentilAnimStatus = (byte) 0x00;
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(1);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(2);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(3);
+				mVentilAnim = mAnimModeNormal;
+				IMG_VENTIL_ANIM.setVisibility(View.INVISIBLE);
+				return;
+			}
+
+			if (hVentilAnimStatus == hWind) {
+				return;
+			}
+
+			if ((hWind == VentiAPI.WIND.LOW) || (hWind == VentiAPI.WIND.MID) || (hWind == VentiAPI.WIND.HI)) {
+				if (mVentilAnimHandler == null) return;
+				hVentilAnimStatus = hWind;
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(1);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(2);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(3);
+				mVentilAnimImgCnt = 0;
+				mVentilAnimHandler.sendEmptyMessage(hWind);
+				IMG_VENTIL_ANIM.setVisibility(View.VISIBLE);
+			}
+			else {
+				hVentilAnimStatus = (byte) 0x00;
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(1);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(2);
+				if (mVentilAnimHandler != null) mVentilAnimHandler.removeMessages(3);
+				mVentilAnim = mAnimModeNormal;
+				IMG_VENTIL_ANIM.setImageResource(mVentilAnim[mVentilAnim.length - 1]);
+				IMG_VENTIL_ANIM.setVisibility(View.INVISIBLE);
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAirFlowAnim(byte hWind)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+
+	/**
+	 * 전원버튼 ON/OFF 이미지 교체
+	 *
+	 * @param OnOff - true : ON, false : OFF
+	 */
+	private void drawPower(boolean OnOff) {
+		try {
+			if (BTN_ONOFF_POWER != null) {
+				if (OnOff) BTN_ONOFF_POWER.setButtonRearImage();
+				else BTN_ONOFF_POWER.setButtonFrontImage();
+			}
+			else Log.w(TAG, "[drawPower] BTN_ONOFF_POWER is null!!");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawPower(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 자동청정 ON/OFF 이미지 교체
+	 *
+	 * @param OnOff - true : ON, false : OFF
+	 */
+	private void drawAutoClean(boolean OnOff) {
+		try {
+			if (BTN_ONOFF_AUTOCLEAN != null) {
+				if (OnOff) BTN_ONOFF_AUTOCLEAN.setButtonRearImage();
+				else BTN_ONOFF_AUTOCLEAN.setButtonFrontImage();
+			}
+			else Log.w(TAG, "[drawAutoClean] BTN_ONOFF_AUTOCLEAN is null!!");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAutoClean(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 자동운전 ON/OFF 이미지 교체
+	 *
+	 * @param OnOff - true : ON, false : OFF
+	 */
+	private void drawAutoDriving(boolean OnOff) {
+		try {
+			if (BTN_VENTILMODE_AUTO != null) {
+				if (OnOff) BTN_VENTILMODE_AUTO.setButtonRearImage();
+				else BTN_VENTILMODE_AUTO.setButtonFrontImage();
+			}
+			else Log.w(TAG, "[drawAutoDriving] BTN_VENTILMODE_AUTO is null!!");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawAutoDriving(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 예약 ON/OFF 이미지 교체
+	 *
+	 * @param OnOff - true : ON, false : OFF
+	 */
+	private void drawReservation(boolean OnOff) {
+		try {
+			if (BTN_ONOFF_RESERVATION != null) {
+				if (OnOff) BTN_ONOFF_RESERVATION.setButtonRearImage();
+				else BTN_ONOFF_RESERVATION.setButtonFrontImage();
+			}
+			else Log.w(TAG, "[drawReservation] BTN_ONOFF_RESERVATION is null!!");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawReservation(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 예약 ON/OFF 이미지 교체
+	 *
+	 * @param OnOff - true : ON, false : OFF
+	 */
+	private void drawHeater(boolean OnOff) {
+		try {
+			if (BTN_ONOFF_HEATER != null) {
+				if (OnOff) BTN_ONOFF_HEATER.setButtonRearImage();
+				else BTN_ONOFF_HEATER.setButtonFrontImage();
+			}
+			else Log.w(TAG, "[drawHeater] BTN_ONOFF_HEATER is null!!");
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawHeater(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 풍량버튼 이미지 교체
+	 *
+	 * @param hWind - 변경할 풍량 (VentiAPI.WIND.LOW, VentiAPI.WIND.MID, VentiAPI.WIND.HI)
+	 */
+	private void drawWind(byte hWind) {
+		try {
+			Log.i(TAG, "[drawWind] hWind [" + hWind + "], OnOff [" + OnOff + "], HDCAutoAirClean [" + HDCAutoAirClean + "], AutoDriving [" + AutoDriving + "]");
+			if (OnOff && (HDCAutoAirClean || AutoDriving)) {
+				// 자동청정기능 동작중
+				if (hWind == VentiAPI.WIND.LOW) {
+					BTN_WIND_01.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_01_selecteddisabled);
+					BTN_WIND_02.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_02_disabled);
+					BTN_WIND_03.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_03_disabled);
+				}
+				else if (hWind == VentiAPI.WIND.MID) {
+					BTN_WIND_01.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_01_disabled);
+					BTN_WIND_02.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_02_selecteddisabled);
+					BTN_WIND_03.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_03_disabled);
+				}
+				else if (hWind == VentiAPI.WIND.HI) {
+					BTN_WIND_01.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_01_disabled);
+					BTN_WIND_02.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_02_disabled);
+					BTN_WIND_03.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_03_selecteddisabled);
+				}
+				else {
+					BTN_WIND_01.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_01_disabled);
+					BTN_WIND_02.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_02_disabled);
+					BTN_WIND_03.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_03_disabled);
+				}
+			}
+			else {
+				BTN_WIND_01.setButtonEventOffDisable();
+				BTN_WIND_02.setButtonEventOffDisable();
+				BTN_WIND_03.setButtonEventOffDisable();
+				if (hWind == VentiAPI.WIND.LOW) {
+					BTN_WIND_01.setButtonEventOffEnable();
+
+					BTN_WIND_01.setButtonRearImage();
+					BTN_WIND_02.setButtonFrontImage();
+					BTN_WIND_03.setButtonFrontImage();
+				}
+				else if (hWind == VentiAPI.WIND.MID) {
+					BTN_WIND_02.setButtonEventOffEnable();
+
+					BTN_WIND_01.setButtonFrontImage();
+					BTN_WIND_02.setButtonRearImage();
+					BTN_WIND_03.setButtonFrontImage();
+				}
+				else if (hWind == VentiAPI.WIND.HI) {
+					BTN_WIND_03.setButtonEventOffEnable();
+
+					BTN_WIND_01.setButtonFrontImage();
+					BTN_WIND_02.setButtonFrontImage();
+					BTN_WIND_03.setButtonRearImage();
+				}
+				else {
+					BTN_WIND_01.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_01_disabled);
+					BTN_WIND_02.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_02_disabled);
+					BTN_WIND_03.setButtonEventOffEnable(R.drawable.ctrl_ventil_btn_wind_03_disabled);
+				}
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawPower(boolean OnOff)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 타이머 시간 표시 변경
+	 *
+	 * @param nTimer - 변경할 시간값
+	 */
+	private void drawTimer(int nTimer) {
+		try {
+			Log.i(TAG, "[drawTimer] nTimer [" + nTimer + "]");
+			String strTimer = new String();
+
+			if (!OnOff) {
+				BTN_TIMER_LEFT.setButtonEventOffEnable(R.drawable.control_venti_btn_arrow_back_disabled);
+				BTN_TIMER_RIGHT.setButtonEventOffEnable(R.drawable.control_venti_btn_arrow_next_disabled);
+				strTimer = "꺼짐";
+			}
+			else {
+				BTN_TIMER_LEFT.setButtonEventOffDisable();
+				BTN_TIMER_RIGHT.setButtonEventOffDisable();
+
+				if (nTimer == 0) {
+					strTimer = "계속";
+				}
+				else if (nTimer == 255) {
+					strTimer = "4시간 초과";
+				}
+				else {
+					int timer = nTimer;
+					int Hour = timer / 60;
+					if (Hour == 0) {
+						strTimer = timer + " 분";
+					}
+					else {
+						int Minute = timer - (Hour * 60);
+						if (Minute == 0) strTimer = Hour + " 시간";
+						else strTimer = Hour + " 시간" + "   " + Minute + " 분";
+					}
+				}
+			}
+			Log.i(TAG, "[drawTimer] strTimer [" + strTimer + "]");
+			TXT_TIMER.setText(strTimer);
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawTimer(int nTimer)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+	/**
+	 * 타이머설정 버튼 좌우가 눌렸을 경우 타이머 값을 가져온다.
+	 *
+	 * @param TargetId - 눌린버튼 LEFT or RIGHT (ID.ventimain.button.TIMER_LEFT, ID.ventimain.button.TIMER_RIGHT)
+	 * @return (int) 타이머값
+	 */
+	private int getNextTimerValue(int TargetId) {
+		try {
+			if (mVentilData.TimerTable == null) return 0;
+
+			int retTimer = Timer;
+			if (TargetId == ID.VentilationMainScreenID.BTN.TIMER_LEFT) {
+				int FindIndex = mVentilData.TimerTable.length-1;
+				if (retTimer != mVentilData.TimerTable[0]) {
+					for (int i = 0; i < mVentilData.TimerTable.length; i--) {
+						if (retTimer > mVentilData.TimerTable[FindIndex]) break;
+						FindIndex--;
+					}
+				}
+				retTimer = mVentilData.TimerTable[FindIndex];
+			}
+			else if (TargetId == ID.VentilationMainScreenID.BTN.TIMER_RIGHT) {
+				int FindIndex = 0;
+				if (retTimer < mVentilData.TimerTable[mVentilData.TimerTable.length-1]) {
+					for (int i = 0; i < mVentilData.TimerTable.length; i++) {
+						if (retTimer < mVentilData.TimerTable[FindIndex]) break;
+						FindIndex++;
+					}
+				}
+				retTimer = mVentilData.TimerTable[FindIndex];
+			}
+			return retTimer;
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+            return 0;
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] getNextTimerValue(int TargetId)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+			return 0;
+		}
+	}
+
+	private void drawInstructionInfo() {
+		try {
+			String strPrefix = "";
+			String strBody = "";
+			String strSuffix = "";
+			String strInstruction = "환기 동작 상태가 표시됩니다.";
+
+			// 접두어
+			if (Reservation) strPrefix = "[예약운전] ";
+			else if (HDCAutoAirClean) strPrefix = "[자동청정] ";
+			else strPrefix = "";
+
+			// 바디
+			if (OnOff) {
+				if (ByPass) strBody += "자연환기 동작중";
+				else if (InnerCycle) strBody += "내부순환 동작중";
+				else if (OutAirClean) strBody += "외기청정 동작중";
+				else if (AutoDriving) strBody += "자동운전 동작중";
+				else strBody += "일반환기 동작중";
+			}
+			else {
+				strBody += "환기장비 꺼짐";
+			}
+
+			// 접미어
+			if (HeaterStatus == Venti.HEATER.STAND_BY) strSuffix = " (히터 예열중)";
+			else if (HeaterStatus == Venti.HEATER.ON) strSuffix = " (히터 동작중 - " + HeaterTimeRemaining + "분 후 히터 꺼짐)";
+			else strSuffix = "";
+
+			strInstruction = strPrefix + strBody + strSuffix;
+			Log.i(TAG, "[drawInstructionInfo] strInstruction [" + strInstruction + "]");
+			TXT_INSTRUCTION.setText(strInstruction);
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] drawInstructionInfo()");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+		}
+	}
+
+
+
+	/**
+	 * 제어기 상태를 가져온다.
+	 *
+	 * @param bReal - (boolean) true : 실시간 , false : 가장최근
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int updateVentilatorData(boolean bReal) {
+		printDebugLog("[updateVentilatorData] - Start   (bReal : " + bReal + ")");
+
+
+		printDebugLog("[updateVentilatorData] Heater: " + Support.Heater);
+
+		printDebugLog("[updateVentilatorData] - OK");
+
+		return 0;
+	}
+
+
+
+
+
+	/**
+	 * 디바이스 API 를 Load 한다.
+	 *
+	 * @param wallpadAPI - 생성시 전달받은 WallPadAPI
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int loadAirSensorAPI(WallPadAPI wallpadAPI) {
+		try {
+			// 1. Mode Check
+			if (OPERATION_MODE != Common.MODE_NOMAL) return -1;
+
+			printDebugLog("[loadAirSensorAPI] - Start");
+
+			// 2. wpapi Check
+			if (wallpadAPI == null) {
+				Log.e(TAG, "[loadAirSensorAPI] - wallpadAPI is null");
+				return -2;
+			}
+
+			// 3. Load API
+			printDebugLog("[loadAirSensorAPI] - Step1 : mAirSensorAPI API Load...");
+			try {
+				mAirQualitySensorAPI = wallpadAPI.Get_SensorAp_API();
+			} catch (RuntimeException re) {
+				LogUtil.errorLogInfo("", TAG, re);
+				return -100;
+			}
+			catch (Exception e) {
+				Log.e(TAG, "[loadAirSensorAPI] - [Exception Error] wallpadAPI.Get_SensorAp_API");
+				Log.e(TAG, "[loadAirSensorAPI] - " + e.toString());
+				//e.printStackTrace();
+				LogUtil.errorLogInfo("", TAG, e);
+				return -100;
+			}
+
+			if (mAirQualitySensorAPI == null) {
+				Log.e(TAG, "[loadAirSensorAPI] - mAirSensorAPI is null");
+				return -4;
+			}
+
+			printDebugLog("[loadAirSensorAPI] - OK");
+
+			return 0;
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+			return -101;
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] loadAirSensorAPI(WallPadAPI wpapi)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+			return -101;
+		}
+	}
+
+
+	/**
+	 * 제어기 상태를 가져온다.
+	 *
+	 * @param bReal - (boolean) true : 실시간 , false : 가장최근
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int updateAirSensorData(boolean bReal) {
+		try {
+			printDebugLog("[updateAirSensorData] - Start   (real : " + bReal + ")");
+
+			// 1. Api Load Check
+			if (mAirQualitySensorAPI == null) {
+				Log.e(TAG, "[updateAirSensorData] - mAirSensorAPI unload !!!");
+				return -1;
+			}
+
+			// 2. Reflash
+			int ret = mAirQualitySensorAPI.Refresh(bReal);
+			if (ret < 0) {
+				Log.e(TAG, "[updateAirSensorData] getState - ret (" + ret + ")   ErrorCode = " + mAirQualitySensorAPI.ErrorCode.Get_Error_Str(ret));
+				return -2;
+			}
+
+			// 3. Range Check
+			if ((mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM10 < AIRLevel.LEVEL6.PM10.BEST || mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM10 > AIRLevel.LEVEL6.PM10.WORST) && mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM10 != (byte)0xFF) {
+				Log.e(TAG, "[updateAirSensorData] Dust PM10 Range Error :" + mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM10);
+				return -3;
+			}
+
+			if ((mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM2p5 < AIRLevel.LEVEL6.PM2_5.BEST || mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM2p5 > AIRLevel.LEVEL6.PM2_5.WORST) && mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM2p5 != (byte)0xFF) {
+				Log.e(TAG, "[updateAirSensorData] Dust PM2.5 Range Error :" + mAirQualitySensorAPI.mAirQualityData.device.hLevel_PM2p5);
+				return -4;
+			}
+
+			if ((mAirQualitySensorAPI.mAirQualityData.device.hLevel_CO2 < AIRLevel.LEVEL6.CO2.BEST || mAirQualitySensorAPI.mAirQualityData.device.hLevel_CO2 > AIRLevel.LEVEL6.CO2.WORST) && mAirQualitySensorAPI.mAirQualityData.device.hLevel_CO2 != (byte)0xFF) {
+				Log.e(TAG, "[updateAirSensorData] CO2 Range Error :" + mAirQualitySensorAPI.mAirQualityData.device.hLevel_CO2);
+				return -5;
+			}
+
+			// 4. Data Copy
+
+			mAirQualityData = mAirQualitySensorAPI.mAirQualityData;
+
+			/*if(HDC_TEMP_SHOW)
+			{
+				mData.Level_CO2 = AIRLevel.LEVEL6.CO2.CO2_NORMAL;
+				mData.Co2_Value = 501;
+			}*/
+
+			// 5. Debug msg
+			printDebugLog(mAirQualityData.device.ToDebugString());
+			printDebugLog("[updateAirSensorData] - OK");
+			return 0;
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+			return -101;
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] updateAirSensorData(boolean bReal)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+			return -101;
+		}
+	}
+
+
+	/**
+	 * 디바이스에 알림 BR 을 등록한다.
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int registerAirSensorBR(boolean bRegi) {
+		try {
+			printDebugLog("[registerAirSensorBR] - Start (bRegi:" + bRegi + ")");
+
+			String BR_NAME = ID.AirQualityMainScreenID.BR_AIRQUALITY;
+
+			// 1. Api Load Check
+			if (mAirQualitySensorAPI == null) {
+				Log.e(TAG, "[registerAirSensorBR] - mAirSensorAPI unload !!!");
+				return -1;
+			}
+
+			if (bRegi) {
+				try {
+					mAirQualitySensorAPI.regChangedBR(BR_NAME);
+				} catch (RuntimeException re) {
+					LogUtil.errorLogInfo("", TAG, re);
+					return -101;
+				}
+				catch (Exception e) {
+					Log.e(TAG, "[registerAirSensorBR] - [Exception Error] mAirSensorAPI.regChangedBR");
+					Log.e(TAG, "[registerAirSensorBR] - " + e.toString());
+					//e.printStackTrace();
+            		LogUtil.errorLogInfo("", TAG, e);
+					return -101;
+				}
+				super.addBrActionFilter(BR_NAME);
+			}
+			else {
+				try {
+					mAirQualitySensorAPI.unregChangedBR(BR_NAME);
+				} catch (RuntimeException re) {
+					LogUtil.errorLogInfo("", TAG, re);
+					return -102;
+				}
+				catch (Exception e) {
+					Log.e(TAG, "[registerAirSensorBR] - [Exception Error] mAirSensorAPI.unregChangedBR");
+					Log.e(TAG, "[registerAirSensorBR] - " + e.toString());
+					//e.printStackTrace();
+            		LogUtil.errorLogInfo("", TAG, e);
+					return -102;
+				}
+				super.removeBrActionFilter(BR_NAME);
+			}
+
+			return 0;
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+			return -103;
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[Exception] registerAirSensorBR(boolean bRegi)");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+			return -103;
+		}
+	}
+
+
+
+
+
+
+
+
+
+	/**
+	 * 환기의 취침 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceSleepMode(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceSleepMode] - Start   (bOnOff : " + bOnOff + ")");
+		return 0;
+	}
+
+	/**
+	 * 환기의 운전모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDevicePower(boolean bOnOff) {
+		printDebugLog("[ctrlDevicePower] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDevicePower] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환풍기 예약 운전 동작을 제어한다.
+	 *
+	 * @param bOnOff - 변경할 예약상태 (true : 시작, false : 정지)
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceReservation(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceReservation] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceReservation] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 풍량을 변경한다.
+	 *
+	 * @param hWindType - 변경할 풍량 (VentiAPI.WIND.LOW , VentiAPI.WIND.MID, VentiAPI.WIND.HI)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceWindType(byte hWindType) {
+		printDebugLog("[ctrlDeviceWindType] - Start   (hWindType : " + String.format("[%02x]", hWindType) + ")");
+		printDebugLog("[ctrlDeviceWindType] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 타이머를 변경한다.
+	 *
+	 * @param nTime - 변경할 타이머값
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceTimer(int nTime) {
+		printDebugLog("[ctrlDeviceTimer] - Start (Timer : " + nTime + ")");
+		printDebugLog("[ctrlDeviceTimer] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 자연환기 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceNaturalVentil(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceNaturalVentil] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceNaturalVentil] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 히터 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceHeater(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceHeater] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceHeater] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 필터교환을 리셋한다.
+	 *
+	 * param OnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceResetFilter() {
+		printDebugLog("[ctrlDeviceResetFilter] - Start");
+		printDebugLog("[ctrlDeviceResetFilter] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 자동환기 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceAutoVentil(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceAutoVentil] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceAutoVentil] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 내부순환 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceInternalVentil(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceInternalVentil] - Start   (bOnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceInternalVentil] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기의 외기청정 모드를 변경한다.
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceOutAirClean(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceOutAirClean] - Start   (OnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceOutAirClean] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기 자동 청정 기능
+	 *
+	 * @param bOnOff - (boolean) 변경할 운전모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceAutoAirClean(boolean bOnOff) {
+		printDebugLog("[ctrlDeviceAutoAirClean] - Start   (OnOff : " + bOnOff + ")");
+		printDebugLog("[ctrlDeviceAutoAirClean] - OK");
+		return 0;
+	}
+
+	/**
+	 * 환기 자동 청정 기능
+	 *
+	 * @param hFanMode - (boolean) 변경할 팬 동작 모드 (true:ON , false:OFF)
+	 *
+	 * @return (int) - >=0 : 성공, <0 : 실패
+	 */
+	private int ctrlDeviceAirQualitySensorFan(byte hFanMode) {
+		printDebugLog("[ctrlDeviceAirQualitySensorFan] - Start   (hFanMode : " + hFanMode + ")");
+
+		// 1. Param Check
+
+		// 2. Api Load Check
+		if (mAirQualitySensorAPI == null) {
+			Log.e(TAG, "[ctrlDeviceAirQualitySensorFan] - mVentilAPI unload !!!");
+			return -2;
+		}
+
+		// 2. Control
+		try {
+			int ret = mAirQualitySensorAPI.ctrlFanMode(hFanMode);
+			if (ret < 0) {
+				Log.e(TAG, "[ctrlDeviceAirQualitySensorFan] ctrlFanMode - Error (" + ret + ")   ErrorCode = " + mAirQualitySensorAPI.ErrorCode.ErrStr());
+				return -3;
+			}
+		} catch (RuntimeException re) {
+            LogUtil.errorLogInfo("", TAG, re);
+			return -100;
+        }
+		catch (Exception e) {
+			Log.e(TAG, "[ctrlDeviceAirQualitySensorFan] - [Exception Error] mAirQualitySensorAPI.ctrlFanMode(" + hFanMode + ")");
+			//e.printStackTrace();
+            LogUtil.errorLogInfo("", TAG, e);
+			return -100;
+		}
+		printDebugLog("[ctrlDeviceAirQualitySensorFan] - OK");
+		return 0;
+	}
+
+	// =================================================================================================
+	// [[ Sample ]] region
+	// =================================================================================================
+	/**
+	 * (영업샘플모드) 가상으로 환기의 전원을 ON/OFF 한다.
+	 */
+	private void Sample_PowerOnOff() {
+
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 예약운전을 ON/OFF 한다.
+	 */
+	private void Sample_ReservationOnOff(boolean OnOff) {
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 풍량을 제어한다.
+	 *
+	 * @param Wind - 변경할 풍량 상태
+	 */
+	private void Sample_WindCont(byte Wind) {
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 타이머를 변경한다.
+	 *
+	 * @param TargetId - 눌린 버튼
+	 */
+	private void Sample_TimerCont(int TargetId) {
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 내부순환을 제어한다.
+	 *
+	 * @param OnOff - 변경할 상태
+	 */
+	private void Sample_InnerCycle(boolean OnOff) {
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 외기청정을 제어한다.
+	 *
+	 * @param OnOff - 변경할 상태
+	 */
+	private void Sample_OutAirClean(boolean OnOff) {
+		updateScreen();
+	}
+
+	/**
+	 * (영업샘플모드) 가상으로 환기의 외기청정을 제어한다.
+	 *
+	 * @param OnOff - 변경할 상태
+	 */
+	private void Sample_SleepMode(boolean OnOff) {
+		updateScreen();
+	}
+
+}

BIN
WallPadHomeCtrl/src/main/res/drawable-ldpi/bg_concent_popup_odd.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_inqu_pressed.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_disabled.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_normal.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_back_pressed.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_disabled.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_normal.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_box_next_pressed.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_1.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_2.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_3.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_off_lv_4.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_1.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_2.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_3.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_on_lv_4.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/btn_venti_room_press.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_1.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_2.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/ctrl_ventil_icon_bright_3.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/venti_sanitiztion_bg_status.png


BIN
WallPadHomeCtrl/src/main/res/drawable-mdpi/venti_sanitiztion_bg_status_off.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_blank.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_purple_normal.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_purple_pressed.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_red_normal.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_red_pressed.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_skyblue_normal.png


BIN
WallPadMain/src/main/res/drawable-ldpi/btn_skyblue_pressed.png