From a435c64ee3c69d8bd2068355aa846867a0032e2f Mon Sep 17 00:00:00 2001 From: ritoseo Date: Fri, 27 Feb 2026 10:15:47 +0900 Subject: [PATCH] =?UTF-8?q?v2.0.22=20=EB=B2=84=EC=A0=84=20=EC=B5=9C?= =?UTF-8?q?=EC=A2=85=20=EB=A6=B4=EB=A6=AC=EC=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../java/kr/co/enicom/acs/BaseService.java | 48 ++- .../java/kr/co/enicom/acs/GlobalInfo.java | 130 ++++++- .../main/java/kr/co/enicom/acs/MWMessage.java | 2 + .../java/kr/co/enicom/acs/MainActivity.java | 343 +++++++++++++++--- .../java/kr/co/enicom/acs/MainUiDefine.java | 3 +- .../java/kr/co/enicom/acs/RfidManager.java | 40 +- .../java/kr/co/enicom/acs/ServerManager.java | 188 ++++++++-- .../acs/system/DoorControlTimeActivity.java | 27 +- app/src/main/res/drawable/out_btn.xml | 6 + app/src/main/res/drawable/out_btn_nor.png | Bin 0 -> 11782 bytes app/src/main/res/drawable/out_btn_pressed.png | Bin 0 -> 12770 bytes app/src/main/res/drawable/return_btn.xml | 6 + app/src/main/res/drawable/return_btn_nor.png | Bin 0 -> 12619 bytes .../main/res/drawable/return_btn_pressed.png | Bin 0 -> 13191 bytes .../res/layout/activity_door_control_time.xml | 44 +++ app/src/main/res/layout/activity_main.xml | 104 +++++- app/src/main/res/values/strings.xml | 5 + 18 files changed, 844 insertions(+), 106 deletions(-) create mode 100644 app/src/main/res/drawable/out_btn.xml create mode 100644 app/src/main/res/drawable/out_btn_nor.png create mode 100644 app/src/main/res/drawable/out_btn_pressed.png create mode 100644 app/src/main/res/drawable/return_btn.xml create mode 100644 app/src/main/res/drawable/return_btn_nor.png create mode 100644 app/src/main/res/drawable/return_btn_pressed.png diff --git a/app/build.gradle b/app/build.gradle index a3107d8..6e61b68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,8 +22,8 @@ android { minSdkVersion 26 //noinspection ExpiredTargetSdkVersion targetSdkVersion 30 - versionCode 200000012 - versionName "2.0.12" + versionCode 200000022 + versionName "2.0.22" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" ndk.abiFilters 'armeabi-v7a' } diff --git a/app/src/main/java/kr/co/enicom/acs/BaseService.java b/app/src/main/java/kr/co/enicom/acs/BaseService.java index 060662a..a203b6d 100644 --- a/app/src/main/java/kr/co/enicom/acs/BaseService.java +++ b/app/src/main/java/kr/co/enicom/acs/BaseService.java @@ -294,8 +294,8 @@ public class BaseService extends Service { } if(getUTC() - touchTimeLong > GlobalInfo.mInputTimeout) { if (mLastActivity != null) { - //Log.w(TAG, "Input Timeout! Back to Main Activity"); - //mLastActivity.forceTimeoutReturn(); + Log.w(TAG, "Input Timeout! Back to Main Activity"); + mLastActivity.forceTimeoutReturn(); } } @@ -367,18 +367,54 @@ public class BaseService extends Service { } else if(testDebug.equals("3")) { SystemUtil.property_set("sys.rito.test", ""); GlobalInfo.updateHolidayList(); + } else if(testDebug.equals("4")) { + GlobalInfo.mUseDoorControlTimeOuting = 1; + GlobalInfo.mDoorControlTimeStatus = -1; + SystemUtil.property_set("sys.rito.test", ""); + } else if(testDebug.equals("5")) { + GlobalInfo.mUseDoorControlTimeOuting = 0; + GlobalInfo.mDoorControlTimeStatus = 0; + SystemUtil.property_set("sys.rito.test", ""); } //if(MainActivity.INSTANCE != null) { - { + { // 개방 모드 제어 관련 부분 if (GlobalInfo.mUseDoorControlTime == 1) { - if (GlobalInfo.checkIsDoorControlOpenTime()) { + if(GlobalInfo.mIsOnOutingConfirm == 1 && GlobalInfo.mOutingConfirmStartTime > 0) { + if (MainActivity.INSTANCE != null) { + long curTime = SystemClock.uptimeMillis(); + if(curTime - GlobalInfo.mOutingConfirmStartTime >= 10 * 1000) { // 10초 이내 입력 없을 시 컨펌 모드 해제 + GlobalInfo.mIsOnOutingConfirm = 0; + GlobalInfo.mOutingConfirmStartTime = 0; + MainActivity.INSTANCE.clearOnRfidVerifyingProcess(); + MainActivity.INSTANCE.turnToBaseUI(); + } + } + } + + if(GlobalInfo.mIsOnOuting == 1) { + String curTimeStr = GlobalInfo.getCurrentDateString(); + if(GlobalInfo.mOutingDate.length() > 0 && !GlobalInfo.mOutingDate.equals(curTimeStr)) { + GlobalInfo.mIsOnOuting = 0; + GlobalInfo.updateOutingInfo(false); + + if (MainActivity.INSTANCE != null) { + Log.w(TAG, "Call turnToBaseUI here 0"); + MainActivity.INSTANCE.turnToBaseUI(); + } + } + } + + if (GlobalInfo.checkIsDoorControlOpenTime() && !GlobalInfo.checkIsOutingMode()) { long curTime = SystemClock.uptimeMillis(); - if (GlobalInfo.mDoorControlTimeStatus != 1) { + boolean isTimeChanged = GlobalInfo.checkIsDoorControlOpenTimeChanged(); + if (GlobalInfo.mDoorControlTimeStatus != 1 || isTimeChanged) { + Log.w(TAG, "강제 개방 트리거"); //mDoorManager.controlDoor(true, -1); mDoorManager.forceStatusOrder(DOOR_CONTROL_STATUS_OPEN_LOCK); GlobalInfo.mDoorControlSentLastTime = curTime; if (MainActivity.INSTANCE != null) { + //Log.w(TAG, "Call turnToBaseUI here 1"); MainActivity.INSTANCE.turnToBaseUI(); } } @@ -392,6 +428,7 @@ public class BaseService extends Service { //mDoorManager.controlDoor(false, 0); mDoorManager.queueControlOrder(DOOR_CONTROL_STATUS_CLOSE); if (MainActivity.INSTANCE != null) { + //Log.w(TAG, "Call turnToBaseUI here 2"); MainActivity.INSTANCE.turnToBaseUI(); } } @@ -403,6 +440,7 @@ public class BaseService extends Service { mDoorManager.queueControlOrder(DOOR_CONTROL_STATUS_CLOSE); if (MainActivity.INSTANCE != null) { + //Log.w(TAG, "Call turnToBaseUI here 3"); MainActivity.INSTANCE.turnToBaseUI(); } } diff --git a/app/src/main/java/kr/co/enicom/acs/GlobalInfo.java b/app/src/main/java/kr/co/enicom/acs/GlobalInfo.java index 8767ef7..249d4c4 100644 --- a/app/src/main/java/kr/co/enicom/acs/GlobalInfo.java +++ b/app/src/main/java/kr/co/enicom/acs/GlobalInfo.java @@ -12,10 +12,12 @@ import android.os.Environment; import android.util.Log; import java.io.BufferedInputStream; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStream; @@ -29,6 +31,7 @@ import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.Locale; import kr.co.enicom.acs.manage.LogInfo; import kr.co.enicom.acs.system.SystemUtil; @@ -96,6 +99,7 @@ public class GlobalInfo { public static final int DEFAULT_ATTENDANCE_END_TIME = 18 * 60; public static final int DEFAULT_USE_DOOR_CONTROL_TIME = 0; public static final int DEFAULT_USE_DOOR_CONTROL_TIME_HOLIDAY = 0; + public static final int DEFAULT_USE_DOOR_CONTROL_TIME_OUTING = 0; public static final int DEFAULT_DOOR_CONTROL_TIME_START = 9 * 60; public static final int DEFAULT_DOOR_CONTROL_TIME_END = 18 * 60; public static final String DEFAULT_DOOR_CONTROL_TIME_DATA = convertTimeToLonger(convertMinutesToSimpleTime(DEFAULT_DOOR_CONTROL_TIME_START)) + "~" + convertTimeToLonger(convertMinutesToSimpleTime(DEFAULT_DOOR_CONTROL_TIME_END)); @@ -282,12 +286,18 @@ public class GlobalInfo { public static int mDoorControlTimeStart = 9 * 60; // 개방시간 시작 시간(Minute) Default = 09:00 public static int mDoorControlTimeEnd = 18 * 60; //18 * 60; // 개방시간 종료 시간(Minute) Default = 18:00 public static int mUseDoorControlTimeHoliday = 0; // 개방시간 주말 및 휴무일 사용 여부 + public static int mUseDoorControlTimeOuting = 0; // 개방시간 외출/복귀 모드 사용 여부 + public static int mIsOnOuting = 0; // 개방시간 외출중 여부. 0 : 복귀상태, 1 : 외출중상태. mUseDoorControlTimeOuting = 1인 경우만 유효 + public static int mIsOnOutingConfirm = 0; // 외출하기, 복귀하기 버튼 처리 중인지 + public static long mOutingConfirmStartTime = 0; // 외출하기, 복귀하기 버튼 처리 시작 uptimeMillis + public static String mOutingDate = ""; // 외출 시작 일자 public static String mDoorControlTimeData = DEFAULT_DOOR_CONTROL_TIME_DATA; public static ArrayList mHolidayList = null; public static ArrayList mUserList; private static Object mLock = new Object(); public static DoorControlTime[] mDoorControlTimeList = null; + public static DoorControlTime mCurrentDoorControlTime = null; public static void updateHolidayList() { LocalDate today = LocalDate.now(); @@ -365,6 +375,15 @@ public class GlobalInfo { } } + public static String getCurrentDateString() { + SimpleDateFormat dayFormat = new SimpleDateFormat("yyyyMMdd", Locale.getDefault()); + Date currentTime = Calendar.getInstance().getTime(); + + String curdate = dayFormat.format(currentTime); + return curdate; + } + + public static int getCurrentMinutesInDay() { Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); @@ -617,7 +636,7 @@ public class GlobalInfo { "auto_forgery integer, auto_mask_wear integer, manager_login_capture_send integer, use_attendance integer, " + "use_door_control_time integer, door_control_time_start integer, door_control_time_end integer, " + "attendance_start_time integer, attendance_end_time integer, use_attendance_auto_mode integer, attendance_auto_time integer, " + - "use_door_control_time_holiday integer, door_control_time_data text" + + "use_door_control_time_holiday integer, door_control_time_data text, use_door_control_time_outing integer" + ")"; try { database.execSQL(sql); @@ -629,7 +648,7 @@ public class GlobalInfo { "auto_forgery, auto_mask_wear, manager_login_capture_send, use_attendance, " + "use_door_control_time, door_control_time_start, door_control_time_end, " + "attendance_start_time, attendance_end_time, use_attendance_auto_mode, attendance_auto_time, " + - "use_door_control_time_holiday, door_control_time_data " + + "use_door_control_time_holiday, door_control_time_data, use_door_control_time_outing " + ") " + "values (0, '', '', 0, 0, %d, " + "%d, %d, %d, %d, %d, %d, " + @@ -639,7 +658,7 @@ public class GlobalInfo { "%d, %d, %d, %d, " + "%d, %d, %d, " + "%d, %d, %d, %d, " + - "%d, '%s'" + + "%d, '%s', %d" + ")", VERIFY_COMBINATION_OR, DEFAULT_VERIFY_PRINTUSERNAME, DEFAULT_VERIFY_POPUPTIME, DEFAULT_LOG_DELETESTATUS , 1, 1, 1, @@ -649,7 +668,7 @@ public class GlobalInfo { DEFAULT_AUTO_FORGERY, DEFAULT_AUTO_MASK_WEAR, DEFAULT_MANAGER_LOGIN_CAPTURE_SEND, DEFAULT_USE_ATTENDANCE, DEFAULT_USE_DOOR_CONTROL_TIME, DEFAULT_DOOR_CONTROL_TIME_START, DEFAULT_DOOR_CONTROL_TIME_END, DEFAULT_ATTENDANCE_START_TIME, DEFAULT_ATTENDANCE_END_TIME, DEFAULT_USE_ATTENDANCE_AUTO_MODE, DEFAULT_ATTENDANCE_AUTO_TIME, - DEFAULT_USE_DOOR_CONTROL_TIME_HOLIDAY, DEFAULT_DOOR_CONTROL_TIME_DATA + DEFAULT_USE_DOOR_CONTROL_TIME_HOLIDAY, DEFAULT_DOOR_CONTROL_TIME_DATA, DEFAULT_USE_DOOR_CONTROL_TIME_OUTING ); database.execSQL(sql); @@ -761,6 +780,14 @@ public class GlobalInfo { } catch (Exception e) { } } + if(!columnExists(database, "settings", "use_door_control_time_outing")) { + columnAppend(database, "settings", "use_door_control_time_outing", "integer"); + sql = String.format("update settings set use_door_control_time_outing = %d where idx = 0", DEFAULT_USE_DOOR_CONTROL_TIME_OUTING); + try { + database.execSQL(sql); + } catch (Exception e) { + } + } if(!columnExists(database, "settings", "attendance_start_time")) { columnAppend(database, "settings", "attendance_start_time", "integer"); @@ -1360,7 +1387,7 @@ public class GlobalInfo { "dcu_watchdog_timeout, verify_log_auto_resend, verify_activate_method, auto_forgery, auto_mask_wear, manager_login_capture_send, use_attendance, " + "use_door_control_time, door_control_time_start, door_control_time_end, " + "attendance_start_time, attendance_end_time, use_attendance_auto_mode, attendance_auto_time, " + - "use_door_control_time_holiday, door_control_time_data " + + "use_door_control_time_holiday, door_control_time_data, use_door_control_time_outing " + " from settings where idx = 0"; try { Cursor cursor = database.rawQuery(sql, null); @@ -1414,6 +1441,8 @@ public class GlobalInfo { GlobalInfo.mUseDoorControlTimeHoliday = cursor.getInt(38); GlobalInfo.mDoorControlTimeData = cursor.getString(39); + GlobalInfo.mUseDoorControlTimeOuting = cursor.getInt(40); + Log.w("RITO", "mAutoForgery : " + GlobalInfo.mAutoForgery); Log.w("RITO", "mAutoMaskWear : " + GlobalInfo.mAutoMaskWear); } @@ -2314,7 +2343,7 @@ public class GlobalInfo { "auto_forgery = %d, auto_mask_wear = %d, manager_login_capture_send = %d, use_attendance = %d, " + "use_door_control_time = %d, door_control_time_start = %d, door_control_time_end = %d, " + "attendance_start_time = %d, attendance_end_time = %d, use_attendance_auto_mode = %d, attendance_auto_time = %d, " + - "use_door_control_time_holiday = %d, door_control_time_data = '%s' " + + "use_door_control_time_holiday = %d, door_control_time_data = '%s', use_door_control_time_outing = %d " + " where idx = 0", GlobalInfo.mDeviceId, GlobalInfo.mDeviceName, GlobalInfo.mVerifyMode, GlobalInfo.mVerifyMethod, GlobalInfo.mVerifyCombination, GlobalInfo.mVerifyPrintUserName, GlobalInfo.mVerifyPopupTime, GlobalInfo.mLogDeleteStatus, GlobalInfo.mLogDeleteTerm, GlobalInfo.mLogDeleteCheckPeriod, GlobalInfo.mLogDeleteCheckPeriodCnt, @@ -2325,7 +2354,7 @@ public class GlobalInfo { GlobalInfo.mAutoForgery, GlobalInfo.mAutoMaskWear, GlobalInfo.mManagerLoginCaptureSend, GlobalInfo.mUseAttendance, GlobalInfo.mUseDoorControlTime, GlobalInfo.mDoorControlTimeStart, GlobalInfo.mDoorControlTimeEnd, GlobalInfo.mAttendanceStartTime, GlobalInfo.mAttendanceEndTime, GlobalInfo.mUseAttendanceAutoMode, GlobalInfo.mAttendanceAutoTimeMinute, - GlobalInfo.mUseDoorControlTimeHoliday, GlobalInfo.mDoorControlTimeData + GlobalInfo.mUseDoorControlTimeHoliday, GlobalInfo.mDoorControlTimeData, GlobalInfo.mUseDoorControlTimeOuting ); try { @@ -2567,6 +2596,44 @@ public class GlobalInfo { return tableCount; } + public static void updateOutingInfo(boolean isOut) { + String saveStr = null; + if(isOut) { + saveStr = "1"; + } else { + saveStr = "0"; + } + String dateStr = getCurrentDateString(); + saveStr += ":"; + saveStr += dateStr; + saveStringInfo("outing.info", saveStr); + GlobalInfo.mOutingDate = dateStr; + } + + public static String readValueFromFile(String filename) { + String _storagePath = Environment.getExternalStorageDirectory().toString(); + String _acsPath = _storagePath + "/ACS"; + String _acsFilePath = _acsPath + "/" + filename; + + File file = new File(_acsFilePath); + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(file)); + // 한 줄만 읽기 + return reader.readLine(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } public static void saveStringInfo(String filename, String data) { String _storagePath = Environment.getExternalStorageDirectory().toString(); String _acsPath = _storagePath + "/ACS"; @@ -2686,6 +2753,55 @@ public class GlobalInfo { return null; } + public static boolean checkIsDoorControlOpenTimeChanged() { + boolean isChanged = false; + if(!checkIsDoorControlOpenTime()) + return false; + + DoorControlTime[] timeList; + synchronized (mLock) { + timeList = mDoorControlTimeList; + } + if(timeList == null || timeList.length == 0) + return false; + + int currentMinutes = getCurrentMinutesInDay(); + for(DoorControlTime info : timeList) { + if(currentMinutes >= info.startTime && currentMinutes < info.endTime) { + if(mCurrentDoorControlTime == null || mCurrentDoorControlTime.startTime != info.startTime || mCurrentDoorControlTime.endTime != info.endTime) { + isChanged = true; + mCurrentDoorControlTime = info; + String changedTime = convertTimeToLonger(convertMinutesToSimpleTime(info.startTime)) + "~" + convertTimeToLonger(convertMinutesToSimpleTime(info.endTime)); + Log.d(TAG, "DoorOpen Time is Changed to [" + changedTime + "]"); + } + + break; + } + } + + return isChanged; + } + + public static boolean checkIsOutingConfirmMode() { + if(mUseDoorControlTimeOuting == 0) + return false; + + if(mIsOnOutingConfirm == 1) + return true; + + return false; + } + + public static boolean checkIsOutingMode() { + if(mUseDoorControlTimeOuting == 0) + return false; + + if(mIsOnOuting == 1) + return true; + + return false; + } + public static boolean checkIsDoorControlOpenTime() { if(mUseDoorControlTime == 0) return false; diff --git a/app/src/main/java/kr/co/enicom/acs/MWMessage.java b/app/src/main/java/kr/co/enicom/acs/MWMessage.java index 60afb8b..a6f58e0 100644 --- a/app/src/main/java/kr/co/enicom/acs/MWMessage.java +++ b/app/src/main/java/kr/co/enicom/acs/MWMessage.java @@ -88,4 +88,6 @@ public class MWMessage { public String yearOfHoliday; public String monthOfHoliday; public String daysOfHoliday; + + public String useDoorControlTimeOuting; } diff --git a/app/src/main/java/kr/co/enicom/acs/MainActivity.java b/app/src/main/java/kr/co/enicom/acs/MainActivity.java index 11895a0..05cd0f9 100644 --- a/app/src/main/java/kr/co/enicom/acs/MainActivity.java +++ b/app/src/main/java/kr/co/enicom/acs/MainActivity.java @@ -18,6 +18,7 @@ import android.os.Build; import android.os.Handler; import android.os.Message; import android.os.SystemClock; +import android.provider.Settings; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Spannable; @@ -62,6 +63,7 @@ import static kr.co.enicom.acs.GlobalInfo.VERIFY_METHOD_VEIN; import static kr.co.enicom.acs.GlobalInfo.VERIFY_METHOD_VEIN_COMB_RFID; import static kr.co.enicom.acs.GlobalInfo.VERIFY_METHOD_VEIN_FACE; import static kr.co.enicom.acs.GlobalInfo.getCurrentMinutesInDay; +import static kr.co.enicom.acs.GlobalInfo.mSerialNumber; import static kr.co.enicom.acs.GlobalInfo.mVerifyCombination; import static kr.co.enicom.acs.GlobalInfo.mVerifyMethod; @@ -81,6 +83,8 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul VerifyPopupManager mPopupManager = null; MediaPlayer mPlayer = null; + public boolean mIsOnUiTransition = false; // turnToBaseUI 블럭 + ServerManager.ServerNotify NOTIFY_HANDLER; public static int POPUP_TYPE_GRANT = 1; @@ -114,6 +118,8 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul private Handler mDelayHandler = new Handler(); private Button mSettingButton = null, mTitleBackButton = null; private Button mWorkinButton = null, mWorkoutButton = null, mAttendanceButton = null; + private Button mOutButton = null, mReturnButton = null; + private CameraSurfaceView mCameraView = null; @@ -680,6 +686,9 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul }.start();*/ } + public void clearOnRfidVerifyingProcess() { + mIsOnRfidVerifyingProcess = false; + } @Override public void onRfidResult(String status, String value) { @@ -687,6 +696,15 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul //if(mMainUiStatus == MAIN_SELECT_VEIN) //return; + // OpenLock 상태인지 체크 후 강제 개방 처리 + if (GlobalInfo.checkIsDoorControlOpenTime() && !GlobalInfo.checkIsOutingMode()) + { + int doorStatus = BaseService.mDCUManager.getReportValues(DCUManager.DCU_REPORT_TYPE_DMON)[0]; + if(doorStatus == GlobalInfo.DOOR_CONTROL_STATUS_CLOSE) { + GlobalInfo.mDoorControlTimeStatus = 0; + } + } + if(mMainUiStatus == RESULT_SUCCESS || mMainUiStatus == RESULT_FAIL) return; @@ -1107,11 +1125,14 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul GlobalInfo.mDeviceStatusNormal = true; - GlobalInfo.initInfo(); GlobalInfo.reloadUserListWithProgress(this); GlobalInfo.updateDoorControlTimeList(); + if(GlobalInfo.mDeviceId.length() > 0) { + version.setText(String.format("[ V%s](ID:%s)", getVersionInfo(this), GlobalInfo.mDeviceId)); + } + //test //GlobalInfo.mVerifyMethod = GlobalInfo.VERIFY_METHOD_FINGER_FACE; //GlobalInfo.mVerifyCombination = VERIFY_COMBINATION_AND; @@ -1280,6 +1301,11 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul @Override public void onClick(View view) { // TODO : click event + + if(GlobalInfo.checkIsOutingConfirmMode()) { + return; + } + mMainUiStatus = -1; if(GlobalInfo.isActivatedMethod(VERIFY_METHOD_VEIN) || GlobalInfo.isActivatedMethod(VERIFY_METHOD_VEIN_FACE)) { GlobalInfo.mVeinWorkMode = GlobalInfo.VEIN_WORK_MODE_NONE; @@ -1386,6 +1412,36 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } }); + + + if(mOutButton == null) + mOutButton = (Button) findViewById(R.id.outbutton) ; + + mOutButton.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View view) + { + GlobalInfo.mOutingConfirmStartTime = SystemClock.uptimeMillis(); + GlobalInfo.mIsOnOutingConfirm = 1; + turnToBaseUI(); + } + }); + + + + if(mReturnButton == null) + mReturnButton = (Button) findViewById(R.id.returnbutton) ; + + mReturnButton.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View view) + { + GlobalInfo.mOutingConfirmStartTime = SystemClock.uptimeMillis(); + GlobalInfo.mIsOnOutingConfirm = 1; + turnToBaseUI(); + } + }); + startService(new Intent(this, BaseService.class)); GlobalInfo.mDoorControlTimeStatus = -1; @@ -1472,6 +1528,8 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } @Override public void run() { + boolean prev_link_status = false; + boolean prev_conn_status = false; mIsAlive = true; while(mIsAlive) { TextView _view = findViewById(R.id.editDateTime); @@ -1491,43 +1549,47 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul if (BaseService.mServerManager != null) { _view = findViewById(R.id.textNetwork); - if (BaseService.mServerManager.checkServerConnection()/* || force*/) { - runOnUiThread(new Runnable() { - @Override - public void run() { + boolean conn_status = BaseService.mServerManager.checkServerConnection(); + if(prev_conn_status != conn_status) { + prev_conn_status = conn_status; + if (conn_status/* || force*/) { + runOnUiThread(new Runnable() { + @Override + public void run() { // TextView _textNetwork = findViewById(R.id.textNetwork); // _textNetwork.setTextColor(Color.parseColor("#3AD531")); // _textNetwork.setText(R.string.main_network_success); - ImageView _imgView = findViewById(R.id.imageViewServerLink); - if (_imgView != null) { - //_imgView.setImageResource(R.drawable.network_icon); - _imgView.setImageResource(R.drawable.main_server_icon_nor); - _imgView.setVisibility(View.VISIBLE); + ImageView _imgView = findViewById(R.id.imageViewServerLink); + if (_imgView != null) { + //_imgView.setImageResource(R.drawable.network_icon); + _imgView.setImageResource(R.drawable.main_server_icon_nor); + _imgView.setVisibility(View.VISIBLE); - //_imgView.setVisibility(View.INVISIBLE); + //_imgView.setVisibility(View.INVISIBLE); + } } - } - }); - } else { + }); + } else { /*_view.setTextColor(Color.RED); _view.setText("네트워크 오류");*/ - runOnUiThread(new Runnable() { - @Override - public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { // TextView _textNetwork = findViewById(R.id.textNetwork); // _textNetwork.setTextColor(Color.parseColor("#FF0000")); // _textNetwork.setText(R.string.main_network_fail); - ImageView _imgView = findViewById(R.id.imageViewServerLink); - if (_imgView != null) { - //_imgView.setImageResource(R.drawable.network_icon_error); - _imgView.setImageResource(R.drawable.main_server_icon_error); - _imgView.setVisibility(View.VISIBLE); + ImageView _imgView = findViewById(R.id.imageViewServerLink); + if (_imgView != null) { + //_imgView.setImageResource(R.drawable.network_icon_error); + _imgView.setImageResource(R.drawable.main_server_icon_error); + _imgView.setVisibility(View.VISIBLE); + } } - } - }); + }); + } } // Check physical link @@ -1535,13 +1597,21 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul if(file != null && file.exists()) { String linkCheck = null; - try { - String line = null; - BufferedReader buf = new BufferedReader(new FileReader(file.getAbsoluteFile().toString())); - while((line=buf.readLine())!=null){ - linkCheck = line.trim(); - } - buf.close(); +// try { +// String line = null; +// BufferedReader buf = new BufferedReader(new FileReader(file.getAbsoluteFile().toString())); +// while((line=buf.readLine())!=null){ +// linkCheck = line.trim(); +// } +// buf.close(); +// } catch (Exception e) { +// e.printStackTrace(); +// } + + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + // 작업 수행 (끝나면 자동으로 close 호출됨) + String line = br.readLine(); + linkCheck = line.trim(); } catch (Exception e) { e.printStackTrace(); } @@ -1553,21 +1623,28 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } } - final boolean link_status = link_is_okay; - runOnUiThread(new Runnable() { - @Override - public void run() { - ImageView _imgView = findViewById(R.id.imageViewNetwork); - if (_imgView != null) { - if(link_status) { - _imgView.setImageResource(R.drawable.main_network_icon_nor); - } else { - _imgView.setImageResource(R.drawable.main_network_icon_error); - } - _imgView.setVisibility(View.VISIBLE); - } + if(prev_link_status != link_is_okay) { + if(prev_link_status && !link_is_okay) { + SystemUtil.shellCommand("niasysc SHELL-ORDER=ifconfig eth0 down && ifconfig eth0 up && touch /mnt/obb/ethrenew"); } - }); + + prev_link_status = link_is_okay; + final boolean link_status = link_is_okay; + runOnUiThread(new Runnable() { + @Override + public void run() { + ImageView _imgView = findViewById(R.id.imageViewNetwork); + if (_imgView != null) { + if (link_status) { + _imgView.setImageResource(R.drawable.main_network_icon_nor); + } else { + _imgView.setImageResource(R.drawable.main_network_icon_error); + } + _imgView.setVisibility(View.VISIBLE); + } + } + }); + } } } @@ -1823,6 +1900,23 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } //Log.e("ryu", "on start face init!"); + if(GlobalInfo.mUseDoorControlTimeOuting == 1) { + String outingValue = GlobalInfo.readValueFromFile("outing.info"); + if (outingValue != null) { + outingValue = outingValue.trim(); + Log.w(TAG, "outingValue : " + outingValue); + try { + String[] values = outingValue.split(":"); + Log.w(TAG, "values[0] : " + values[0]); + GlobalInfo.mIsOnOuting = Integer.parseInt(values[0]); + GlobalInfo.mOutingDate = values[1]; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + Log.w(TAG, "mIsOnOuting : " + GlobalInfo.mIsOnOuting); turnToBaseUI(); } }.start(); @@ -2076,6 +2170,59 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } } + if(GlobalInfo.checkIsOutingMode() && !GlobalInfo.checkIsOutingConfirmMode()) { + mIsOnRfidVerifyingProcess = false; + return; + } + + if(logResult.mId.length() > 0 && GlobalInfo.checkIsOutingConfirmMode()) { // 외출 인증 모드인 경우 + if(mOutButton.getVisibility() == View.VISIBLE) { + GlobalInfo.mIsOnOuting = 1; + + mIsOnUiTransition = true; + + Message message = new Message(); + message.what= RESULT_OUTING_CHANGE; + message.obj = logResult.mName; + mMainUiHandler.handleMessage(message); + + new Thread() { + @Override + public void run() { + GlobalInfo.updateOutingInfo(true); + } + }.start(); + return; + } else if(mReturnButton.getVisibility() == View.VISIBLE) { + GlobalInfo.mIsOnOuting = 0; + + mIsOnUiTransition = true; + + Message message = new Message(); + message.what= RESULT_OUTING_CHANGE; + message.obj = logResult.mName; + mMainUiHandler.handleMessage(message); + + new Thread() { + @Override + public void run() { + GlobalInfo.updateOutingInfo(false); + } + }.start(); + return; + } + } + + if(logResult.mId.length() == 0 && GlobalInfo.checkIsOutingConfirmMode()) { + mIsOnUiTransition = true; + + Message message = new Message(); + message.what= RESULT_OUTING_CHANGE_FAIL; + message.obj = logResult.mName; + mMainUiHandler.handleMessage(message); + return; + } + GlobalInfo.updateLogging(logResult); if(BaseService.mServerManager != null) { if(GlobalInfo.mUseAttendance == 1 && GlobalInfo.mAttendanceMode != GlobalInfo.ATTENDANCE_MODE_NONE) { @@ -2179,6 +2326,9 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } public void turnToBaseUI() { + if(mIsOnUiTransition) + return; + if(mVerifyMethod == GlobalInfo.VERIFY_METHOD_VEIN) mMainUiHandler.sendEmptyMessage(MAIN_SELECT_VEIN); else if(mVerifyMethod == VERIFY_METHOD_RFID) @@ -2273,7 +2423,7 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul mCameraView.setDropFrame(true); BaseService.mFaceManager.mRBitmapFrameQueue.clear(); - if(GlobalInfo.checkIsDoorControlOpenTime()) { // 개방시간 사용 시간여부 + if((GlobalInfo.checkIsOutingMode() || GlobalInfo.checkIsDoorControlOpenTime()) && !GlobalInfo.checkIsOutingConfirmMode()) { // 개방시간 사용 시간여부(외출 모드 인증 모드는 아니어야 함) LayoutSetting(mVerifyCheck, CHECK, 563, 126, 155, 155, R.drawable.popup_fail, View.INVISIBLE); LayoutSetting(mLoginImage[CARD], CARD, 348, 40, 0, 0, R.drawable.main_img1, View.INVISIBLE); LayoutSetting(mLoginImage[VEIN], VEIN, 348, 40, 0, 0, R.drawable.main_img2, View.INVISIBLE); @@ -2288,18 +2438,52 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul mAttendanceButton.setVisibility(View.INVISIBLE); } - TextView tv = findViewById(R.id.doorcontroltimetext); + if(GlobalInfo.mUseDoorControlTimeOuting == 1) { + if(GlobalInfo.mIsOnOuting == 0) { + TextView tv = findViewById(R.id.doorcontroltimeoutingtext); + GlobalInfo.DoorControlTime timeInfo = GlobalInfo.getMatchDoorControlOpenTime(getCurrentMinutesInDay()); + if (timeInfo != null) { + tv.setText(String.format("%02d:%02d~%02d:%02d", timeInfo.startTime / 60, timeInfo.startTime % 60 + , timeInfo.endTime / 60, timeInfo.endTime % 60)); + } + mOutButton.setVisibility(View.VISIBLE); + findViewById(R.id.doorcontroltimeoutingtext).setVisibility(View.VISIBLE); + findViewById(R.id.doorcontrolmsgoutingtext).setVisibility(View.VISIBLE); + findViewById(R.id.doorcontrolframeouting).setVisibility(View.VISIBLE); + + mReturnButton.setVisibility(View.INVISIBLE); + findViewById(R.id.doorcontroltimeoutingtext2).setVisibility(View.INVISIBLE); + findViewById(R.id.doorcontrolmsgoutingtext2).setVisibility(View.INVISIBLE); + } else { + mOutButton.setVisibility(View.INVISIBLE); + findViewById(R.id.doorcontroltimeoutingtext).setVisibility(View.INVISIBLE); + findViewById(R.id.doorcontrolmsgoutingtext).setVisibility(View.INVISIBLE); + + mReturnButton.setVisibility(View.VISIBLE); + findViewById(R.id.doorcontroltimeoutingtext2).setVisibility(View.VISIBLE); + findViewById(R.id.doorcontrolmsgoutingtext2).setVisibility(View.VISIBLE); + + findViewById(R.id.doorcontrolframeouting).setVisibility(View.VISIBLE); + } + + findViewById(R.id.doorcontrolframeouting).setVisibility(View.VISIBLE); + findViewById(R.id.doorcontrolframe).setVisibility(View.INVISIBLE); + } else { + TextView tv = findViewById(R.id.doorcontroltimetext); // tv.setText(String.format("%d:%02d~%d:%02d", GlobalInfo.mDoorControlTimeStart / 60, GlobalInfo.mDoorControlTimeStart % 60 // , GlobalInfo.mDoorControlTimeEnd / 60, GlobalInfo.mDoorControlTimeEnd % 60)); - GlobalInfo.DoorControlTime timeInfo = GlobalInfo.getMatchDoorControlOpenTime(getCurrentMinutesInDay()); - if(timeInfo != null) { - tv.setText(String.format("%02d:%02d~%02d:%02d", timeInfo.startTime / 60, timeInfo.startTime % 60 - , timeInfo.endTime / 60, timeInfo.endTime % 60)); + GlobalInfo.DoorControlTime timeInfo = GlobalInfo.getMatchDoorControlOpenTime(getCurrentMinutesInDay()); + if (timeInfo != null) { + tv.setText(String.format("%02d:%02d~%02d:%02d", timeInfo.startTime / 60, timeInfo.startTime % 60 + , timeInfo.endTime / 60, timeInfo.endTime % 60)); + } + findViewById(R.id.doorcontrolframe).setVisibility(View.VISIBLE); + findViewById(R.id.doorcontrolframeouting).setVisibility(View.INVISIBLE); } - findViewById(R.id.doorcontrolframe).setVisibility(View.VISIBLE); return; } else { + findViewById(R.id.doorcontrolframeouting).setVisibility(View.INVISIBLE); findViewById(R.id.doorcontrolframe).setVisibility(View.INVISIBLE); } @@ -2509,6 +2693,8 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } break; + + case RESULT_OUTING_CHANGE: case RESULT_SUCCESS: if(mCameraView != null) { mCameraView.setDropFrame(true); @@ -2520,6 +2706,36 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul LayoutSetting(mLoginImage[VEIN], VEIN, 348, 40, 0, 0, R.drawable.main_img2, View.INVISIBLE); LayoutSetting(mLoginImage[FINGER], FINGER, 348, 40, 0, 0, R.drawable.main_fingerprint, View.INVISIBLE); LayoutSetting(mLoginImage[FACE], FACE, 348, 40, 0, 0, R.drawable.main_fingerprint, View.INVISIBLE); + + if(msg.what == RESULT_OUTING_CHANGE) { + String user = "[외출모드]"; + if(GlobalInfo.mIsOnOuting == 0) { + user = "[개방모드]"; + } + int width = (int)mLoginText[COLOR_YELLOW].getPaint().measureText(user); + int startx = (1280 - 465 - width)/2; + LayoutSetting(mLoginText[COLOR_WHITE], COLOR_WHITE, startx + width, 375, 465, 65, R.string.main_outing_change, View.VISIBLE); + LayoutSetting(mLoginText[COLOR_YELLOW], COLOR_YELLOW, startx, 375, width, 65, 0, View.VISIBLE, user); + + GlobalInfo.mIsOnOutingConfirm = 0; + GlobalInfo.mOutingConfirmStartTime = 0; + mIsOnRfidVerifyingProcess = false; + //waitTimeHandler(MAIN_UI_INIT, GlobalInfo.mVerifyPopupTime * 1000); + + new Thread() { + @Override + public void run() { + try { + sleep(GlobalInfo.mVerifyPopupTime * 1000); + mIsOnUiTransition = false; + turnToBaseUI(); + } catch(Exception e) { + } + } + }.start(); + break; + } + String user = getString(R.string.main_verify_1) + ((String)msg.obj) + getString(R.string.main_verify_2) + getString(R.string.main_verify_3); if(GlobalInfo.mVerifyPrintUserName == GlobalInfo.DEFAULT_VERIFY_PRINTUSERNAME) { int width = (int)mLoginText[COLOR_YELLOW].getPaint().measureText(user); @@ -2541,7 +2757,9 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul waitTimeHandler(RESULT_SUCCESS,GlobalInfo.mVerifyPopupTime * 1000); break; + case RESULT_OUTING_CHANGE_FAIL: case RESULT_FAIL: + if(mCameraView != null) { mCameraView.setDropFrame(true); } @@ -2563,6 +2781,26 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul } mIsOnRfidVerifyingProcess = false; + if(msg.what == RESULT_OUTING_CHANGE_FAIL) { + GlobalInfo.mIsOnOutingConfirm = 0; + GlobalInfo.mOutingConfirmStartTime = 0; + mIsOnRfidVerifyingProcess = false; + + new Thread() { + @Override + public void run() { + try { + sleep(GlobalInfo.mVerifyPopupTime * 1000); + mIsOnUiTransition = false; + turnToBaseUI(); + } catch(Exception e) { + } + } + }.start(); + break; + } + + waitTimeHandler(RESULT_FAIL,GlobalInfo.mVerifyPopupTime * 1000); break; } @@ -2689,6 +2927,7 @@ public class MainActivity extends AppCompatActivity implements RfidManager.resul mDelayHandler.removeMessages(MAIN_SELECT_FACE); mDelayHandler.removeMessages(MAIN_SELECT_VEIN_FACE); mDelayHandler.removeMessages(MAIN_SELECT_FINGER_FACE); + mDelayHandler.removeMessages(RESULT_OUTING_CHANGE); } } diff --git a/app/src/main/java/kr/co/enicom/acs/MainUiDefine.java b/app/src/main/java/kr/co/enicom/acs/MainUiDefine.java index 18efd5f..740d9d8 100644 --- a/app/src/main/java/kr/co/enicom/acs/MainUiDefine.java +++ b/app/src/main/java/kr/co/enicom/acs/MainUiDefine.java @@ -28,5 +28,6 @@ public interface MainUiDefine { public static final int MAIN_SELECT_FACE = 6; public static final int MAIN_SELECT_VEIN_FACE = 7; public static final int MAIN_SELECT_FINGER_FACE = 8; - + public static final int RESULT_OUTING_CHANGE = 9; + public static final int RESULT_OUTING_CHANGE_FAIL = 10; } diff --git a/app/src/main/java/kr/co/enicom/acs/RfidManager.java b/app/src/main/java/kr/co/enicom/acs/RfidManager.java index cab4f68..56bb106 100644 --- a/app/src/main/java/kr/co/enicom/acs/RfidManager.java +++ b/app/src/main/java/kr/co/enicom/acs/RfidManager.java @@ -12,6 +12,7 @@ import android.util.Log; import com.hitachi.fv.android.h1client.SecurityLevel; +import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -173,6 +174,10 @@ public class RfidManager implements SerialInputOutputManager.Listener { Log.d(RfidManager.class.getName(), String.format("Received from BLE Reader Module : %d bytes. [%s]", recvSize, byteArrayToHexString(rfidId))); System.arraycopy(readData, 0, accData, accFilled, recvSize); accFilled += recvSize; + } else if(recvSize == 0) { + accFilled = 0; + mSerialManager.CloseSerial(acmHandle); + acmHandle = -1; } if(accFilled > 0) { @@ -212,19 +217,40 @@ public class RfidManager implements SerialInputOutputManager.Listener { } if(acmHandle < 0) { - acmHandle = mSerialManager.OpenSerial("/dev/ttyACM0", 115200); - if(acmHandle < 0) { - if(failedCount < 10000) { + String acmDevice = ""; + for(int i = 0;i < 20;i++) { + acmDevice = "/dev/ttyACM" + i; + File acmCheck = new File(acmDevice); + if(acmCheck.exists()) + break; + + acmDevice = ""; + } + + if(acmDevice.length() > 0) { + acmHandle = mSerialManager.OpenSerial(acmDevice, 115200); + if (acmHandle < 0) { + if (failedCount < 10000) { + failedCount++; + } + Log.e(RfidManager.class.getName(), "Error to open BLE Reader Module[" + acmDevice + "]!"); + try { + sleep(500 * failedCount); + } catch (InterruptedException e) { + } + } else { + failedCount = 0; + Log.d(RfidManager.class.getName(), "Success to open BLE Reader Module[" + acmDevice + "] :-)"); + } + } else { + Log.d(RfidManager.class.getName(), "Cannot find BLE Reader Module :-("); + if (failedCount < 10000) { failedCount++; } - Log.e(RfidManager.class.getName(), "Error to open BLE Reader Module[ttyACM0]!"); try { sleep(500 * failedCount); } catch (InterruptedException e) { } - } else { - failedCount = 0; - Log.d(RfidManager.class.getName(), "Success to open BLE Reader Module[ttyACM0] :-)"); } } } diff --git a/app/src/main/java/kr/co/enicom/acs/ServerManager.java b/app/src/main/java/kr/co/enicom/acs/ServerManager.java index bc0ed6b..31ebf34 100644 --- a/app/src/main/java/kr/co/enicom/acs/ServerManager.java +++ b/app/src/main/java/kr/co/enicom/acs/ServerManager.java @@ -489,6 +489,7 @@ public class ServerManager extends Thread { public final static int FINGER_CODE_LENGTH = 960; public final static int FACE_EMBED_LENGTH = 2048; public final static int DOOR_CONTROL_COMMAND_LENGTH = 1; + public final static int FIRE_STATUS_LENGTH = 20; public final static int NETWORK_TYPE_LENGTH = 1; public final static int NETWORK_IPV4_LENGTH = 15; public final static int DEVICE_NAME_LENGTH = 20; @@ -566,11 +567,16 @@ public class ServerManager extends Thread { public final static byte COMMAND_TYPE_ATTENDANCE_LOG_GET = 0x44; // 41. 근태 이력 로그 요청 public final static byte COMMAND_TYPE_DELETE_ATTENDANCE_LOG_ALL = 0x45; + // v3.8 public final static byte COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V2 = 0x46; // 43. 개방시간 저장(2) - 다중저장 public final static byte COMMAND_TYPE_DOOR_CONTROL_TIME_GET_V2 = 0x47; public final static byte COMMAND_TYPE_HOLYDAY_SET = 0x48; // 45. 공휴일 저장 public final static byte COMMAND_TYPE_HOLYDAY_GET = 0x49; + // v3.9 + public final static byte COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V3 = 0x50; + public final static byte COMMAND_TYPE_DOOR_CONTROL_TIME_GET_V3 = 0x51; + boolean callback_progress = true; LogInfo result_handler = new LogInfo(); ServerNotify NOTIFY_HANDLER = new ServerNotify() { @@ -1641,8 +1647,11 @@ public class ServerManager extends Thread { if(!GlobalInfo.mDeviceStatusNormal) replyStatus = PKT_STATUS_FAIL; - String[] dataArray = new String[1]; + String[] dataArray = new String[2]; dataArray[0] = getPaddingString("" + openStatus, DOOR_CONTROL_COMMAND_LENGTH); + int[] values = BaseService.mDCUManager.getReportValues(DCUManager.DCU_REPORT_TYPE_FIRESW); + String fireStatus = String.format("%d,%d", values[0], values[1]); + dataArray[1] = getPaddingString(fireStatus, FIRE_STATUS_LENGTH); message = createClientMessage(COMMAND_TYPE_DEVICE_DOOR_STATUS_GET, getMsgDeviceId(), replyStatus, dataArray); sendPushMessage(message); } @@ -2457,6 +2466,57 @@ public class ServerManager extends Thread { message = createClientMessage(COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V2, getMsgDeviceId(), replyStatus, null); sendPushMessage(message); } + } else if(commandMsg[1] == COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V3) { // 47. 개방시간 설정 3 + if(statusMsgStr.equals(PKT_STATUS_OKAY)) { + int parseLen = 1; + byte[] parseMsg = new byte[parseLen]; + System.arraycopy(message, idx, parseMsg, 0, parseLen); + idx += parseLen; + msg.useDoorControlTime = new String(parseMsg).trim(); + Log.i(TAG, "parseMessage. useDoorControlTime : " + msg.useDoorControlTime); + + parseMsg = new byte[parseLen]; + System.arraycopy(message, idx, parseMsg, 0, parseLen); + idx += parseLen; + msg.useDoorControlTimeHoliday = new String(parseMsg).trim(); + Log.i(TAG, "parseMessage. useDoorControlTimeHoliday : " + msg.useDoorControlTimeHoliday); + + parseMsg = new byte[parseLen]; + System.arraycopy(message, idx, parseMsg, 0, parseLen); + idx += parseLen; + msg.useDoorControlTimeOuting = new String(parseMsg).trim(); + Log.i(TAG, "parseMessage. useDoorControlTimeOuting : " + msg.useDoorControlTimeOuting); + + parseLen = TOTAL_COUNT_LENGTH; + parseMsg = new byte[parseLen]; + System.arraycopy(message, idx, parseMsg, 0, parseLen); + idx += parseLen; + int totalCount = SystemUtil.fromByteArrayToInt(parseMsg); + msg.doorControlTimeListCount = "" + totalCount; + + if(totalCount > 0) { + msg.doorControlTimeList = new String[totalCount]; + for (int i = 0; i < totalCount; i++) { + parseLen = TIME_LENGTH_RANGE; + parseMsg = new byte[parseLen]; + System.arraycopy(message, idx, parseMsg, 0, parseLen); + idx += parseLen; + try { + msg.doorControlTimeList[i] = new String(parseMsg).trim(); + Log.i(TAG, "parseMessage. doorControlTime : " + msg.doorControlTimeList[i]); + } catch (Exception e) { + } + } + } + + String replyStatus = PKT_STATUS_FAIL; + boolean result = handleMessage(msg); + if(result) + replyStatus = PKT_STATUS_OKAY; + + message = createClientMessage(COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V3, getMsgDeviceId(), replyStatus, null); + sendPushMessage(message); + } } else if(commandMsg[1] == COMMAND_TYPE_DOOR_CONTROL_TIME_GET_V2) { // 개방시간 정보 조회 2 String replyStatus = PKT_STATUS_OKAY; if(statusMsgStr.equals(PKT_STATUS_OKAY)) { @@ -2479,6 +2539,30 @@ public class ServerManager extends Thread { message = createClientMessage(commandMsg[1], getMsgDeviceId(), replyStatus, null); } + sendPushMessage(message); + } else if(commandMsg[1] == COMMAND_TYPE_DOOR_CONTROL_TIME_GET_V3) { // 개방시간 정보 조회 3 + String replyStatus = PKT_STATUS_OKAY; + if(statusMsgStr.equals(PKT_STATUS_OKAY)) { + GlobalInfo.DoorControlTime[] timeList = GlobalInfo.getDoorControlTimeList(); + int totalCount = timeList.length; + byte[][] dataArray = new byte[4 + totalCount][]; + dataArray[0] = getPaddingString(GlobalInfo.mUseDoorControlTime == 1 ? "Y" : "N", 1).getBytes(); + dataArray[1] = getPaddingString(GlobalInfo.mUseDoorControlTimeHoliday == 1 ? "Y" : "N", 1).getBytes(); + dataArray[2] = getPaddingString(GlobalInfo.mUseDoorControlTimeOuting == 1 ? "Y" : "N", 1).getBytes(); + dataArray[3] = intTobyte(totalCount, ByteOrder.LITTLE_ENDIAN); + for(int i = 0;i < totalCount;i++) { + String timeRange = getPaddingString(GlobalInfo.convertMinutesToSimpleTime(timeList[i].startTime), TIME_LENGTH); + timeRange += getPaddingString(GlobalInfo.convertMinutesToSimpleTime(timeList[i].endTime), TIME_LENGTH); + dataArray[4 + i] = timeRange.getBytes(); + } + + message = createClientMessageByte(commandMsg[1], getMsgDeviceId(), replyStatus, dataArray); + sendPushMessage(message); + } else { + replyStatus = PKT_STATUS_FAIL; + message = createClientMessage(commandMsg[1], getMsgDeviceId(), replyStatus, null); + } + sendPushMessage(message); } else if(commandMsg[1] == COMMAND_TYPE_HOLYDAY_SET) { // 45. 공휴일 설정 if(statusMsgStr.equals(PKT_STATUS_OKAY)) { @@ -3129,23 +3213,23 @@ public class ServerManager extends Thread { } else if(msg.command == COMMAND_TYPE_DOOR_CONTROL_TIME_SET) { // 37. 개방시간 설정 try { int nextUse = msg.useDoorControlTime.equals("Y") ? 1 : 0; - boolean isNeedInvalidate = false; - if(nextUse != GlobalInfo.mUseDoorControlTime) { - isNeedInvalidate = true; - } +// boolean isNeedInvalidate = false; +// if(nextUse != GlobalInfo.mUseDoorControlTime) { +// isNeedInvalidate = true; +// } +// isNeedInvalidate = true; // GlobalInfo.mUseDoorControlTime = msg.useDoorControlTime.equals("Y") ? 1 : 0; GlobalInfo.mDoorControlTimeStart = GlobalInfo.convertSimpleTimeToMinutes(msg.doorControlStartTime); GlobalInfo.mDoorControlTimeEnd = GlobalInfo.convertSimpleTimeToMinutes(msg.doorControlEndTime); GlobalInfo.mDoorControlTimeData = GlobalInfo.convertTimeToLonger(msg.doorControlStartTime) + "~" + GlobalInfo.convertTimeToLonger(msg.doorControlEndTime); GlobalInfo.updateDoorControlTimeList(); GlobalInfo.mUseDoorControlTime = nextUse; - if(isNeedInvalidate) { - if (nextUse == 1) { - GlobalInfo.mDoorControlTimeStatus = -1; - } else { - GlobalInfo.mDoorControlTimeStatus = 0; - } + if (nextUse == 1) { + GlobalInfo.mDoorControlTimeStatus = -1; + } else { + GlobalInfo.mDoorControlTimeStatus = 0; } + GlobalInfo.updateDatabase(GlobalInfo.TARGET_FLAG_DEVICE_INFO); } catch(Exception e) { ret = false; @@ -3154,13 +3238,13 @@ public class ServerManager extends Thread { try { int nextUse = msg.useDoorControlTime.equals("Y") ? 1 : 0; int nextUseHoliday = msg.useDoorControlTimeHoliday.equals("Y") ? 1 : 0; - boolean isNeedInvalidate = false; - if(nextUse != GlobalInfo.mUseDoorControlTime) { - isNeedInvalidate = true; - } - if(nextUseHoliday != GlobalInfo.mUseDoorControlTimeHoliday) { - isNeedInvalidate = true; - } +// boolean isNeedInvalidate = false; +// if(nextUse != GlobalInfo.mUseDoorControlTime) { +// isNeedInvalidate = true; +// } +// if(nextUseHoliday != GlobalInfo.mUseDoorControlTimeHoliday) { +// isNeedInvalidate = true; +// } int totalCount = Integer.parseInt(msg.doorControlTimeListCount); String newTime = ""; @@ -3176,13 +3260,13 @@ public class ServerManager extends Thread { GlobalInfo.updateDoorControlTimeList(); GlobalInfo.mUseDoorControlTimeHoliday = nextUseHoliday; GlobalInfo.mUseDoorControlTime = nextUse; - if(isNeedInvalidate) { - if (nextUse == 1) { - GlobalInfo.mDoorControlTimeStatus = -1; - } else { - GlobalInfo.mDoorControlTimeStatus = 0; - } + + if (nextUse == 1) { + GlobalInfo.mDoorControlTimeStatus = -1; + } else { + GlobalInfo.mDoorControlTimeStatus = 0; } + GlobalInfo.updateDatabase(GlobalInfo.TARGET_FLAG_DEVICE_INFO); } catch(Exception e) { ret = false; @@ -3204,6 +3288,37 @@ public class ServerManager extends Thread { } catch(Exception e) { ret = false; } + } else if(msg.command == COMMAND_TYPE_DOOR_CONTROL_TIME_SET_V3) { // 47. 개방시간 설정 3 + try { + int nextUse = msg.useDoorControlTime.equals("Y") ? 1 : 0; + int nextUseHoliday = msg.useDoorControlTimeHoliday.equals("Y") ? 1 : 0; + + int totalCount = Integer.parseInt(msg.doorControlTimeListCount); + String newTime = ""; + for(int i = 0;i < totalCount;i++) { + String startTime = msg.doorControlTimeList[i].substring(0, 4); + String endTime = msg.doorControlTimeList[i].substring(4); + if(i > 0) { + newTime += ","; + } + newTime += (GlobalInfo.convertTimeToLonger(startTime) + "~" + GlobalInfo.convertTimeToLonger(endTime)); + } + GlobalInfo.mDoorControlTimeData = newTime; + GlobalInfo.updateDoorControlTimeList(); + GlobalInfo.mUseDoorControlTimeHoliday = nextUseHoliday; + GlobalInfo.mUseDoorControlTime = nextUse; + GlobalInfo.mUseDoorControlTimeOuting = msg.useDoorControlTimeOuting.equals("Y") ? 1 : 0; + + if (nextUse == 1) { + GlobalInfo.mDoorControlTimeStatus = -1; + } else { + GlobalInfo.mDoorControlTimeStatus = 0; + } + + GlobalInfo.updateDatabase(GlobalInfo.TARGET_FLAG_DEVICE_INFO); + } catch(Exception e) { + ret = false; + } } @@ -3291,6 +3406,7 @@ public class ServerManager extends Thread { public void run() { byte[] buffer = new byte[32768]; int cnt = 0; + int prevFireStatus = -1; int ret; long checkTime = SystemClock.uptimeMillis() - GlobalInfo.mStatePeriod * 1000; long reportTime = SystemClock.uptimeMillis() - GlobalInfo.mStatePeriod * 1000 + 1000; @@ -3400,6 +3516,19 @@ public class ServerManager extends Thread { } } + // 소방 상태 주기적 체크 + int[] fireStatusValue = BaseService.mDCUManager.getReportValues(DCUManager.DCU_REPORT_TYPE_FIRESW); + boolean needToNotifyDoorStatus = false; + if(fireStatusValue != null) { + if(prevFireStatus < 0) + prevFireStatus = fireStatusValue[0]; + + if(prevFireStatus != fireStatusValue[0]) { + needToNotifyDoorStatus = true; + } + prevFireStatus = fireStatusValue[0]; + } + long curTime = SystemClock.uptimeMillis(); if(curTime - checkTime > GlobalInfo.mStatePeriod * 1000) { checkTime = curTime; @@ -3419,7 +3548,7 @@ public class ServerManager extends Thread { } } - if(curTime - reportTime > GlobalInfo.mStatePeriod * 1000) { + if(curTime - reportTime > GlobalInfo.mStatePeriod * 1000 || needToNotifyDoorStatus) { reportTime = curTime; if(mWrite != null) { byte[] message; @@ -3429,8 +3558,15 @@ public class ServerManager extends Thread { if(!GlobalInfo.mDeviceStatusNormal) replyStatus = PKT_STATUS_FAIL; - String[] dataArray = new String[1]; + // SDK V3.7까지 +// String[] dataArray = new String[1]; +// dataArray[0] = getPaddingString("" + openStatus, DOOR_CONTROL_COMMAND_LENGTH); + // SDK V3.8 + String[] dataArray = new String[2]; dataArray[0] = getPaddingString("" + openStatus, DOOR_CONTROL_COMMAND_LENGTH); + //int[] values = BaseService.mDCUManager.getReportValues(DCUManager.DCU_REPORT_TYPE_FIRESW); + String fireStatus = String.format("%d,%d", fireStatusValue[0], fireStatusValue[1]); + dataArray[1] = getPaddingString(fireStatus, FIRE_STATUS_LENGTH); message = createClientMessage(COMMAND_TYPE_DEVICE_DOOR_REPORT, getMsgDeviceId(), replyStatus, dataArray); sendPushMessage(message); } diff --git a/app/src/main/java/kr/co/enicom/acs/system/DoorControlTimeActivity.java b/app/src/main/java/kr/co/enicom/acs/system/DoorControlTimeActivity.java index 49bba46..f8f7151 100644 --- a/app/src/main/java/kr/co/enicom/acs/system/DoorControlTimeActivity.java +++ b/app/src/main/java/kr/co/enicom/acs/system/DoorControlTimeActivity.java @@ -46,12 +46,13 @@ public class DoorControlTimeActivity extends BaseActivity { private final int DEVICE_NAME_POPUP = 1; private int modifyIdx = 0; + private static int INSERT_DATA_ROW = 3; protected void refreshDoorControlTimeList() { String[] timeList = GlobalInfo.mDoorControlTimeData.split(","); LinearLayout parentLayout = findViewById(R.id.frameLayout2); int viewCount = parentLayout.getChildCount(); - if(viewCount > 3) { - parentLayout.removeViews(2, viewCount - 3); + if(viewCount > INSERT_DATA_ROW + 1) { + parentLayout.removeViews(INSERT_DATA_ROW, viewCount - INSERT_DATA_ROW - 1); } int offset = -60; @@ -155,7 +156,7 @@ public class DoorControlTimeActivity extends BaseActivity { newLayout.addView(imgButton); } - int insertIndex = 2; // 원하는 위치 + int insertIndex = INSERT_DATA_ROW; // 원하는 위치 parentLayout.addView(newLayout, insertIndex); } @@ -217,6 +218,26 @@ public class DoorControlTimeActivity extends BaseActivity { } + ImageView doorcontroltimeuseoutingimage = (ImageView) findViewById(R.id.doorcontroltimeuseoutingimage); + doorcontroltimeuseoutingimage.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View view) { + if(GlobalInfo.mUseDoorControlTimeOuting == 0) { + doorcontroltimeuseoutingimage.setImageResource(R.drawable.toggle_pressed); + GlobalInfo.mUseDoorControlTimeOuting = 1; + } + else { + GlobalInfo.mUseDoorControlTimeOuting = 0; + doorcontroltimeuseoutingimage.setImageResource(R.drawable.toggle_nor); + } + } + }); + + if(GlobalInfo.mUseDoorControlTimeOuting == 0) { + doorcontroltimeuseoutingimage.setImageResource(R.drawable.toggle_nor); + } else { + doorcontroltimeuseoutingimage.setImageResource(R.drawable.toggle_pressed); + } // Button button = (Button) findViewById(R.id.doorcontroltimesetimagebutton) ; // button.setOnClickListener(new Button.OnClickListener() { diff --git a/app/src/main/res/drawable/out_btn.xml b/app/src/main/res/drawable/out_btn.xml new file mode 100644 index 0000000..ff144fd --- /dev/null +++ b/app/src/main/res/drawable/out_btn.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/out_btn_nor.png b/app/src/main/res/drawable/out_btn_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2dcbc7d76352e5b7fa762eab61acbf7a4f3873 GIT binary patch literal 11782 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 ZHTbTaDlX<7ih+obG}U$0KC0Lt{||6ts(1hZ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/return_btn.xml b/app/src/main/res/drawable/return_btn.xml new file mode 100644 index 0000000..a85238c --- /dev/null +++ b/app/src/main/res/drawable/return_btn.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/return_btn_nor.png b/app/src/main/res/drawable/return_btn_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c13df27dd7f1f75f54891d689db7390db1bd619a GIT binary patch literal 12619 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 SHe2fjv49fLyHDj;Xn$~D*@2zyG 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 K%`)|e*#85NFG;ol literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_door_control_time.xml b/app/src/main/res/layout/activity_door_control_time.xml index b640601..0c56afe 100644 --- a/app/src/main/res/layout/activity_door_control_time.xml +++ b/app/src/main/res/layout/activity_door_control_time.xml @@ -144,6 +144,50 @@ app:srcCompat="@drawable/toggle_pressed" /> + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index bd62687..984761e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -23,7 +23,7 @@ android:layout_marginStart="1104px" android:layout_marginTop="20px" android:visibility="visible" - app:srcCompat="@drawable/main_network_icon_nor" /> + app:srcCompat="@drawable/main_network_icon_error" /> + app:srcCompat="@drawable/main_server_icon_error" /> @@ -92,6 +94,7 @@ android:layout_height="95px" android:layout_marginStart="1145px" android:layout_marginTop="481px" + android:alpha="0" android:background="@drawable/admin_icon_btn" />