Skip to content

Commit dd0797b

Browse files
Merge pull request #286 from TakayukiHoshi1984/modify_deviceized_the_light
デバイスプラグインのライトの管理方法の変更
2 parents 6fc72a3 + a7f7d8f commit dd0797b

14 files changed

Lines changed: 342 additions & 58 deletions

File tree

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
64BB087D19C335EE00C66903 /* HueSDK_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 64BB087C19C335EE00C66903 /* HueSDK_iOS.framework */; };
4747
8EB854441D423FDD0035C0DC /* dconnect_icon_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EB854421D423FDD0035C0DC /* dconnect_icon_off.png */; };
4848
8EB854451D423FDD0035C0DC /* dconnect_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EB854431D423FDD0035C0DC /* dconnect_icon.png */; };
49+
AB00F287204AB53E00D9BF8A /* DPHueLightService.m in Sources */ = {isa = PBXBuildFile; fileRef = AB00F286204AB53E00D9BF8A /* DPHueLightService.m */; };
4950
AB08A0F019920F8F0024C996 /* hue001.png in Resources */ = {isa = PBXBuildFile; fileRef = AB08A0E719920C860024C996 /* hue001.png */; };
5051
AB08A0F119920F8F0024C996 /* hue002.png in Resources */ = {isa = PBXBuildFile; fileRef = AB08A0E819920C860024C996 /* hue002.png */; };
5152
AB08A0F219920F8F0024C996 /* hue003.png in Resources */ = {isa = PBXBuildFile; fileRef = AB08A0E919920C860024C996 /* hue003.png */; };
@@ -120,6 +121,8 @@
120121
64BB087C19C335EE00C66903 /* HueSDK_iOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HueSDK_iOS.framework; path = "deps/PhilipsHueSDK-iOS-OSX/HueSDK_iOS.framework"; sourceTree = "<group>"; };
121122
8EB854421D423FDD0035C0DC /* dconnect_icon_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dconnect_icon_off.png; sourceTree = "<group>"; };
122123
8EB854431D423FDD0035C0DC /* dconnect_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dconnect_icon.png; sourceTree = "<group>"; };
124+
AB00F285204AB53E00D9BF8A /* DPHueLightService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DPHueLightService.h; sourceTree = "<group>"; };
125+
AB00F286204AB53E00D9BF8A /* DPHueLightService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DPHueLightService.m; sourceTree = "<group>"; };
123126
AB08A0E719920C860024C996 /* hue001.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hue001.png; sourceTree = "<group>"; };
124127
AB08A0E819920C860024C996 /* hue002.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hue002.png; sourceTree = "<group>"; };
125128
AB08A0E919920C860024C996 /* hue003.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = hue003.png; sourceTree = "<group>"; };
@@ -314,6 +317,8 @@
314317
D6C860271D390C0300232EEF /* DPHueService.m */,
315318
D6D1727F1D647B7200444337 /* DPHueReachability.h */,
316319
D6D172801D647B7200444337 /* DPHueReachability.m */,
320+
AB00F285204AB53E00D9BF8A /* DPHueLightService.h */,
321+
AB00F286204AB53E00D9BF8A /* DPHueLightService.m */,
317322
);
318323
path = Classes;
319324
sourceTree = "<group>";
@@ -554,6 +559,7 @@
554559
64A3E56119B9393400B83DAF /* DPHueModelController.m in Sources */,
555560
64A3E56419B93AE400B83DAF /* DPHueSettingViewControllerBase.m in Sources */,
556561
64278B6A19B8AEA800AC54E5 /* DPHueViewController.m in Sources */,
562+
AB00F287204AB53E00D9BF8A /* DPHueLightService.m in Sources */,
557563
64278B6119B8ABAB00AC54E5 /* DPHueSettingViewController1.m in Sources */,
558564
64278B6719B8AC6C00AC54E5 /* DPHueSettingViewController3.m in Sources */,
559565
D6D172811D647B7200444337 /* DPHueReachability.m in Sources */,

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue/Classes/DPHueDevicePlugin.m

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ - (id) init {
4242
[notificationCenter addObserver:_self selector:@selector(enterForeground)
4343
name:UIApplicationWillEnterForegroundNotification
4444
object:application];
45-
45+
[notificationCenter addObserver:_self selector:@selector(enterForeground)
46+
name:UIApplicationDidBecomeActiveNotification
47+
object:application];
48+
4649
[notificationCenter addObserver:_self selector:@selector(enterBackground)
4750
name:UIApplicationDidEnterBackgroundNotification
4851
object:application];
@@ -57,6 +60,7 @@ - (void) dealloc {
5760
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
5861
UIApplication *application = [UIApplication sharedApplication];
5962

63+
[notificationCenter removeObserver:self name:UIApplicationWillEnterForegroundNotification object:application];
6064
[notificationCenter removeObserver:self name:UIApplicationDidBecomeActiveNotification object:application];
6165
[notificationCenter removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:application];
6266
}
@@ -67,10 +71,38 @@ - (void) enterBackground {
6771
[[DPHueManager sharedManager] saveBridgeList];
6872
}
6973
/*!
70-
@brief フォアグラウンドに戻ったときの処理
74+
@brief フォアグラウンドに戻ったときの処理。
75+
すでにHueブリッジと認証されている場合、プロセスキル後にForegroundになった場合自動で再接続を行う。
7176
*/
7277
- (void) enterForeground {
73-
[[DPHueManager sharedManager] readBridgeList];
78+
__weak typeof(self) _self = self;
79+
dispatch_async(dispatch_get_main_queue(), ^{
80+
[[DPHueManager sharedManager] initHue];
81+
[[DPHueManager sharedManager] searchBridgeWithCompletion:^(NSDictionary *bridgesFound) {
82+
for (id key in [bridgesFound keyEnumerator]) {
83+
NSString *ipAddress = bridgesFound[key];
84+
NSString *macAddress = key;
85+
dispatch_async(dispatch_get_main_queue(), ^{
86+
87+
[[DPHueManager sharedManager] startAuthenticateBridgeWithIpAddress:ipAddress
88+
bridgeId:macAddress
89+
receiver:_self localConnectionSuccessSelector:@selector(doAuthSuccess)
90+
noLocalConnection:nil
91+
notAuthenticated:nil];
92+
});
93+
}
94+
}];
95+
});
96+
}
97+
98+
- (void)doAuthSuccess
99+
{
100+
[[DPHueManager sharedManager] disableHeartbeat];
101+
[[DPHueManager sharedManager] deallocPHNotificationManagerWithReceiver:self];
102+
[[DPHueManager sharedManager] deallocHueSDK];
103+
NSDictionary *lights = [[DPHueManager sharedManager] getLightStatus];
104+
105+
[[DPHueManager sharedManager] updateManageServices:(lights.count > 0)];
74106
}
75107

76108
- (NSString*)iconFilePath:(BOOL)isOnline

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue/Classes/DPHueLightProfile.m

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,24 @@ - (id)init
4747
}
4848
NSDictionary *lightList = [[DPHueManager sharedManager] getLightStatus];
4949
DConnectArray *lights = [DConnectArray array];
50-
51-
for (PHLight *light in lightList.allValues) {
50+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
51+
NSString *lightId = nil;
52+
if (arr.count == 3) {
53+
lightId = arr[2];
54+
}
55+
if (!lightId) {
56+
for (PHLight *light in lightList.allValues) {
57+
//ライトの状態をメッセージにセットする(LightID,名前,点灯状態)
58+
DConnectMessage *led = [DConnectMessage new];
59+
[DConnectLightProfile setLightId:light.identifier target:led];
60+
[DConnectLightProfile setLightName:light.name target:led];
61+
[DConnectLightProfile setLightOn:[light.lightState.on boolValue] target:led];
62+
[DConnectLightProfile setLightConfig:@"" target:led];
63+
64+
[lights addMessage:led];
65+
}
66+
} else {
67+
PHLight *light = [[DPHueManager sharedManager] getLightStatusForLightId:lightId];
5268
//ライトの状態をメッセージにセットする(LightID,名前,点灯状態)
5369
DConnectMessage *led = [DConnectMessage new];
5470
[DConnectLightProfile setLightId:light.identifier target:led];
@@ -97,7 +113,10 @@ - (id)init
97113
[response setErrorToEmptyServiceId];
98114
return YES;
99115
}
100-
116+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
117+
if (arr.count == 3) {
118+
lightId = arr[2];
119+
}
101120
// lightIdが省略された場合はデフォルトを使用
102121
if (!lightId) {
103122
lightId = [self getDefaultLightId];
@@ -146,7 +165,10 @@ - (id)init
146165
[response setErrorToEmptyServiceId];
147166
return YES;
148167
}
149-
168+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
169+
if (arr.count == 3) {
170+
lightId = arr[2];
171+
}
150172
// lightIdが省略された場合はデフォルトを使用
151173
if (!lightId) {
152174
lightId = [self getDefaultLightId];
@@ -192,7 +214,10 @@ - (id)init
192214
[response setErrorToEmptyServiceId];
193215
return YES;
194216
}
195-
217+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
218+
if (arr.count == 3) {
219+
lightId = arr[2];
220+
}
196221
// lightIdが省略された場合はデフォルトを使用
197222
if (!lightId) {
198223
lightId = [self getDefaultLightId];
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// DPHueLightService.h
3+
// dConnectDeviceHue
4+
//
5+
// Copyright (c) 2018 NTT DOCOMO, INC.
6+
// Released under the MIT license
7+
// http://opensource.org/licenses/mit-license.php
8+
//
9+
10+
#import <DConnectSDK/DConnectService.h>
11+
#import <DConnectSDK/DConnectFileManager.h>
12+
#import <DConnectSDK/DConnectServiceInformationProfile.h>
13+
14+
15+
@interface DPHueLightService : DConnectService<DConnectServiceInformationProfileDataSource>
16+
- (instancetype) initWithBridgeKey: (NSString *) bridgeKey
17+
bridgeValue: (NSString *) bridgeValue
18+
lightId: (NSString *) lightId
19+
lightName: (NSString *) lightName
20+
plugin: (id) plugin;
21+
@end
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// DPHueLightService.m
3+
// dConnectDeviceHue
4+
//
5+
// Copyright (c) 2018 NTT DOCOMO, INC.
6+
// Released under the MIT license
7+
// http://opensource.org/licenses/mit-license.php
8+
//
9+
10+
#import "DPHueLightService.h"
11+
#import "DPHueLightProfile.h"
12+
13+
@implementation DPHueLightService
14+
- (instancetype) initWithBridgeKey: (NSString *) bridgeKey
15+
bridgeValue: (NSString *) bridgeValue
16+
lightId: (NSString *) lightId
17+
lightName: (NSString *) lightName
18+
plugin: (id) plugin {
19+
NSString *serviceId = [NSString stringWithFormat:@"%@_%@_%@", bridgeValue, bridgeKey, lightId];
20+
self = [super initWithServiceId: serviceId plugin: plugin];
21+
if (self) {
22+
[self setName: lightName];
23+
[self setNetworkType: DConnectServiceDiscoveryProfileNetworkTypeWiFi];
24+
[self setOnline: YES];
25+
26+
// プロファイルを追加
27+
[self addProfile:[DPHueLightProfile new]];
28+
}
29+
return self;
30+
}
31+
32+
#pragma mark - DConnectServiceInformationProfileDataSource Implement.
33+
34+
- (DConnectServiceInformationProfileConnectState)profile:(DConnectServiceInformationProfile *)profile
35+
wifiStateForServiceId:(NSString *)serviceId {
36+
37+
DConnectServiceInformationProfileConnectState wifiState;
38+
if (self.online) {
39+
wifiState = DConnectServiceInformationProfileConnectStateOn;
40+
} else {
41+
wifiState = DConnectServiceInformationProfileConnectStateOff;
42+
}
43+
return wifiState;
44+
}
45+
@end

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue/Classes/DPHueManager.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,13 @@ pushlinkAuthenticationSuccessSelector:(SEL)pushlinkAuthenticationSuccessSelector
155155
*/
156156
-(NSDictionary*)getLightStatus;
157157

158+
/*!
159+
@brief 指定されたライトIDのライトステータスの取得。
160+
@param[in] lightId ステータスを取得したいライトのID。
161+
@retval PHLightオブジェクト
162+
*/
158163

164+
-(PHLight *)getLightStatusForLightId:(NSString *)lightId;
159165

160166
/*!
161167
@brief ライトグループステータスの取得。
@@ -322,5 +328,9 @@ pushlinkAuthenticationSuccessSelector:(SEL)pushlinkAuthenticationSuccessSelector
322328
@brief Hueのブリッジの読み込み。
323329
*/
324330
-(void)readBridgeList;
325-
331+
/*!
332+
@brief Hueプラグインが管理するサービスのオンライン・オフラインを切り替える。
333+
@param[in] onlineForSet YES:オンラインに切り替える NO:オフラインに切り替える
334+
*/
335+
- (void)updateManageServices : (BOOL) onlineForSet;
326336
@end

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue/Classes/DPHueManager.m

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#import "DPHueManager.h"
1111
#import "DPHueService.h"
12+
#import "DPHueLightService.h"
1213
#import "DPHueReachability.h"
1314
#import "DPHueDeviceRepeatExecutor.h"
1415

@@ -177,6 +178,17 @@ -(NSDictionary *)getLightStatus
177178
return cache.lights;
178179
}
179180

181+
//ライトステータスの取得
182+
-(PHLight *)getLightStatusForLightId:(NSString *)lightId
183+
{
184+
PHBridgeResourcesCache *cache = [PHBridgeResourcesReader readBridgeResourcesCache];
185+
for (PHLight *light in cache.lights.allValues) {
186+
if ([light.identifier isEqualToString:lightId]) {
187+
return light;
188+
}
189+
}
190+
return nil;
191+
}
180192
//ライトの点灯
181193
-(BOOL)setLightOnWithResponse:(DConnectResponseMessage*)response
182194
lightId:(NSString*)lightId
@@ -878,15 +890,31 @@ - (void)updateManageServices : (BOOL) onlineForSet {
878890
// ServiceProviderに未登録のデバイスが見つかったら追加登録する。登録済ならそのサービスをオンラインにする
879891
if (bridgesFound.count > 0) {
880892
for (id key in [bridgesFound keyEnumerator]) {
881-
NSString *serviceId = [NSString stringWithFormat:@"%@_%@",[bridgesFound valueForKey:key],key];
893+
NSString *serviceId = [NSString stringWithFormat:@"%@_%@", bridgesFound[key], key];
882894
DConnectService *service = [self.mServiceProvider service: serviceId];
883895
if (service) {
884896
[service setOnline: YES];
885897
} else {
886-
service = [[DPHueService alloc] initWithBridgeKey:key bridgeValue:[bridgesFound valueForKey:key] plugin: [self plugin]];
898+
service = [[DPHueService alloc] initWithBridgeKey:key bridgeValue:bridgesFound[key] plugin: [self plugin]];
887899
[self.mServiceProvider addService: service];
888900
[service setOnline:YES];
889901
}
902+
NSDictionary *lightList = [self getLightStatus];
903+
for (PHLight *light in lightList.allValues) {
904+
NSString *serviceId = [NSString stringWithFormat:@"%@_%@_%@",bridgesFound[key],key,light.identifier];
905+
DConnectService *service = [self.mServiceProvider service: serviceId];
906+
if (service) {
907+
[service setOnline: YES];
908+
} else {
909+
service = [[DPHueLightService alloc] initWithBridgeKey:key
910+
bridgeValue:bridgesFound[key]
911+
lightId:light.identifier
912+
lightName:light.name
913+
plugin:[self plugin]];
914+
[self.mServiceProvider addService: service];
915+
[service setOnline:YES];
916+
}
917+
}
890918
}
891919

892920
}

dConnectDevicePlugin/dConnectDeviceHue/dConnectDeviceHue/Classes/DPHueSettingViewController2.m

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,7 @@ - (void)didPushlinkAuthenticationSuccess
101101
[manager disableHeartbeat];
102102
_statusLabel.text = @"ライト検索中!!";
103103
_authorizeStateLabel.text = DPHueLocalizedString(_bundle, @"HueBridgeAuthorized");
104-
[manager searchLightWithCompletion:^(NSArray *errors) {
105-
dispatch_async(dispatch_get_main_queue(), ^{
106-
[self initHueSdk];
107-
});
108-
}];
109-
110-
104+
[self initHueSdk];
111105
}
112106

113107
- (void)initHueSdk

dConnectDevicePlugin/dConnectDeviceSphero/dConnectDeviceSphero.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
/* Begin PBXBuildFile section */
3535
8EB854541D4240950035C0DC /* dconnect_icon_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EB854521D4240950035C0DC /* dconnect_icon_off.png */; };
3636
8EB854551D4240950035C0DC /* dconnect_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EB854531D4240950035C0DC /* dconnect_icon.png */; };
37+
AB00F28A204AF8AC00D9BF8A /* DPSpheroLightService.m in Sources */ = {isa = PBXBuildFile; fileRef = AB00F289204AF8AC00D9BF8A /* DPSpheroLightService.m */; };
3738
AB73D6A41F7CFCCE00B77A10 /* DPGuideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AB73D6721F7CFCA600B77A10 /* DPGuideViewController.m */; };
3839
AB73D6A51F7CFCCF00B77A10 /* DPSpheroDeviceOrientationProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = AB73D6741F7CFCA600B77A10 /* DPSpheroDeviceOrientationProfile.m */; };
3940
AB73D6A61F7CFCCF00B77A10 /* DPSpheroDevicePlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = AB73D6761F7CFCA600B77A10 /* DPSpheroDevicePlugin.m */; };
@@ -99,6 +100,8 @@
99100
/* Begin PBXFileReference section */
100101
8EB854521D4240950035C0DC /* dconnect_icon_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dconnect_icon_off.png; sourceTree = "<group>"; };
101102
8EB854531D4240950035C0DC /* dconnect_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = dconnect_icon.png; sourceTree = "<group>"; };
103+
AB00F288204AF8AC00D9BF8A /* DPSpheroLightService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DPSpheroLightService.h; sourceTree = "<group>"; };
104+
AB00F289204AF8AC00D9BF8A /* DPSpheroLightService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DPSpheroLightService.m; sourceTree = "<group>"; };
102105
AB3520AF1BACDE6A0010FF55 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
103106
AB3520B01BACDE6A0010FF55 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };
104107
AB39FEBD1B4E19C000A8139E /* RobotKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RobotKit.framework; sourceTree = "<group>"; };
@@ -234,6 +237,8 @@
234237
AB73D67F1F7CFCA600B77A10 /* DPSpheroSensorProfile.m */,
235238
AB73D6801F7CFCA600B77A10 /* DPSpheroService.h */,
236239
AB73D6811F7CFCA600B77A10 /* DPSpheroService.m */,
240+
AB00F288204AF8AC00D9BF8A /* DPSpheroLightService.h */,
241+
AB00F289204AF8AC00D9BF8A /* DPSpheroLightService.m */,
237242
AB73D6821F7CFCA600B77A10 /* DPSpheroSettingViewController.h */,
238243
AB73D6831F7CFCA600B77A10 /* DPSpheroSettingViewController.m */,
239244
AB73D6841F7CFCA600B77A10 /* DPSpheroSystemProfile.h */,
@@ -505,6 +510,7 @@
505510
files = (
506511
AB73D6A41F7CFCCE00B77A10 /* DPGuideViewController.m in Sources */,
507512
AB73D6A51F7CFCCF00B77A10 /* DPSpheroDeviceOrientationProfile.m in Sources */,
513+
AB00F28A204AF8AC00D9BF8A /* DPSpheroLightService.m in Sources */,
508514
AB73D6A61F7CFCCF00B77A10 /* DPSpheroDevicePlugin.m in Sources */,
509515
AB73D6A71F7CFCCF00B77A10 /* DPSpheroDriveControllerProfile.m in Sources */,
510516
AB73D6A81F7CFCCF00B77A10 /* DPSpheroLightProfile.m in Sources */,

0 commit comments

Comments
 (0)