Jason Lee %!s(int64=10) %!d(string=hai) anos
pai
achega
e907eab11d

+ 2 - 1
kneet2/Classes/Definitions.h

@@ -102,7 +102,8 @@ static NSString *kNISCServer = @"https://home-api.allofthings.com:5003";
 #define API_GET_DASHBOARD                   @"/dashboard"       //대시보드
 #define API_GET_DASHBOARD_MODE_LIST         @"/modes"                   //대시보드 모드 조회
 #define API_POST_DASHBOARD_MODE_CHANGE      @"/modes/%@/current_mode"   //대시보드 모드 변경
-//#define API_GET_HOMELOG                     @"/homelog"         //홈로그 - 폐기
+#define API_GET_MODE_STATUS                 @"/modes/%@/status"         //홈모드 변경 결과 조회
+
 #define API_GET_NOTICE_COUNT                @"/notices/count"       //공지 및 알림 카운트
 #define API_GET_NOTICE                      @"/notices"             //공지 목록 조회
 #define API_GET_NOTICE_PERSONAL             @"/notices/personal"    //알림 목록 조회

+ 0 - 1
kneet2/Classes/Model/DeviceModel.h

@@ -55,7 +55,6 @@
 //Command
 @property (copy, nonatomic) NSString *commandId;
 @property (copy, nonatomic) NSString *requestTime;
-@property (copy, nonatomic) NSString *status;
 
 //Local temporary
 @property (assign, nonatomic) BOOL enable;

+ 3 - 0
kneet2/Classes/Model/ItemModel.h

@@ -111,6 +111,9 @@ typedef NS_ENUM(NSInteger, CmdClsType) {
 @property (copy, nonatomic) NSString *nickname;
 @property (copy, nonatomic) NSString *predCmdclsValue;
 
+//Command - things, modes
+@property (copy, nonatomic) NSString *status;
+
 @property (strong, nonatomic) NSMutableArray<ItemModel> *conditions;
 @property (copy, nonatomic) NSArray<CmdClsValueModel> *cmdclsValueList;
 

+ 78 - 1
kneet2/Classes/ViewControllers/MainScreens/HomeModeUpdateViewController.m

@@ -21,7 +21,8 @@
 
 
 @interface HomeModeUpdateViewController () {
-
+    NSTimer *_modeChangePollingTimer;
+    NSDate *_requestTime;
 }
 @end
 
@@ -92,6 +93,11 @@
     [[RequestHandler handler] sendAsyncPostRequestAPIPath:path parameters:nil modelClass:[JDJSONModel class] completion:^(id responseObject) {
         
         if ([[JDFacade facade].currentViewController isEqual:self]) {
+            
+            //check requet done,
+            _requestTime = [NSDate systemDate];
+            [self requestPollingHomeModeChanges];
+            
             [self setContentsForComplete];
         }
         
@@ -137,6 +143,77 @@
     // Dispose of any resources that can be recreated.
 }
 
+- (NSInteger)elapsedSecondsFromNow {
+    NSInteger seconds = 0;
+    
+    if (_requestTime) {
+        NSTimeInterval elapsed = [[NSDate systemDate] timeIntervalSinceDate:_requestTime];
+        seconds = elapsed;
+    }
+    return seconds;
+}
+
+- (void)requestPollingHomeModeChanges {
+    
+    //every 3sec?
+    NSString *path = [NSString stringWithFormat:API_GET_MODE_STATUS, _mode.modeId];
+    
+    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//RUN to background thread
+        ModeModel *response = [[RequestHandler handler] sendSyncGetRequestAPIPath:path parameters:nil
+                                                                             modelClass:[ModeModel class] showLoadingView:YES];
+        if (response) {
+            BOOL isRequestDone = [response.status boolValue];
+            
+            
+            if (isRequestDone) {
+                
+            } else {
+                //실행 여부 및 10초 경과 확인
+                BOOL isOverTimeLimit = [self elapsedSecondsFromNow] > 10;
+            }
+            
+                _mode.
+                rdevice.isRequesting = [rdevice.contentValue isEqualToString:matchedDevice.contentValue] && !hasChangedStatus && !isOverTimeLimit;
+                
+                //TODO - home hub check
+                //                    rdevice.requestTime = matchedDevice.requestTime;
+                //                    rdevice.collectTime = matchedDevice.collectTime;
+                rdevice.onlineState = matchedDevice.onlineState;
+                
+                if (!rdevice.isRequesting || !rdevice.isOnline || ![JDFacade facade].loginUser.isHomehubOnline) {//정상적으로 변경됨.
+                    rdevice.contentValue = matchedDevice.contentValue;
+                    [_commandArray removeObject:rdevice];
+                    
+                    isStatusChanged = YES;
+                }
+                
+#ifdef DEBUG_MODE
+                NSLogInfo(@"==########== device command status = %@, elapsedTime = %zd ==########==", [JDFacade facade].loginUser.homehubOnlineState, elapsedTime);
+#endif
+            }];
+        }
+        
+        if (_commandArray.count) {//커맨드 실행 중인 디바이스가 있을 경우,
+            //schedul timer.
+            if (!_deviceCommandsBackgroundTimer) {
+                _deviceCommandsBackgroundTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(requestPollingCommandStatusOfDeviceInBackground:) userInfo:nil repeats:YES];
+            }
+        } else {
+            [_deviceCommandsBackgroundTimer invalidate];
+            _deviceCommandsBackgroundTimer = nil;
+        }
+        
+        //변화가 있을 경우, 컬렉션뷰를 리로드
+        if (isStatusChanged) {
+            [_collectionView reloadData];
+            
+            ThingsDetailViewController *vc = (ThingsDetailViewController *)[JDFacade facade].currentViewController;
+            if (vc) {
+                [vc.tableView reloadData];
+            }
+        }
+}
+
 
 
 @end

+ 3 - 3
kneet2/Classes/ViewControllers/ThingsScreens/ThingsViewController.m

@@ -205,8 +205,8 @@
                     
                     DeviceModel *matchedDevice = (DeviceModel *)[fdevices.list objectByUsingPredicateFormat:@"deviceId == %@ && nodeId == %@", rdevice.deviceId, rdevice.nodeId];
                     
-                    //실행 여부 및 20초 경과 확인
-                    BOOL isOverTimeLimit = [self elapsedSecondsFromNow:rdevice] > 20;
+                    //실행 여부 및 10초 경과 확인
+                    BOOL isOverTimeLimit = [self elapsedSecondsFromNow:rdevice] > 10;
                     
                     //실행 여부 확인
                     NSInteger elapsedTime = [self elapsedSecondsFrom:rdevice to:matchedDevice];
@@ -214,7 +214,7 @@
                     
                     rdevice.isRequesting = [rdevice.contentValue isEqualToString:matchedDevice.contentValue] && !hasChangedStatus && !isOverTimeLimit;
                     
-                    //TODO - home hub
+                    //TODO - home hub check
 //                    rdevice.requestTime = matchedDevice.requestTime;
 //                    rdevice.collectTime = matchedDevice.collectTime;
                     rdevice.onlineState = matchedDevice.onlineState;