Skip to content

Commit 8771ebe

Browse files
Spheroプラグインが管理するライトをServiceDiscoveryで見つかるようにした。
1 parent 1a478d7 commit 8771ebe

6 files changed

Lines changed: 161 additions & 38 deletions

File tree

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 */,

dConnectDevicePlugin/dConnectDeviceSphero/dConnectDeviceSphero/Classes/DPSpheroLightProfile.m

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@
1212
#import "DPSpheroManager.h"
1313
#import "DPSpheroDeviceRepeatExecutor.h"
1414

15-
//LEDは色を変えられる
16-
static NSString *const SpheroLED = @"1";
17-
static NSString *const SpheroLEDName = @"Sphero LED";
18-
//Calibrationは色を変えられない
19-
static NSString *const SpheroCalibration = @"2";
20-
static NSString *const SpheroCalibrationName = @"Sphero CalibrationLED";
2115

2216
@implementation DPSpheroLightProfile {
2317
DPSpheroDeviceRepeatExecutor *_flashingExecutor;
@@ -41,7 +35,12 @@ - (id)init
4135
[response setErrorToEmptyServiceId];
4236
return YES;
4337
}
44-
38+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
39+
NSString *lightId = nil;
40+
if (arr.count == 2) {
41+
lightId = arr[1];
42+
serviceId = arr[0];
43+
}
4544
// 接続確認
4645
CONNECT_CHECK();
4746

@@ -50,20 +49,22 @@ - (id)init
5049
DConnectMessage *calibration = [DConnectMessage new];
5150

5251
[response setResult:DConnectMessageResultTypeOk];
53-
54-
// 全体の色を変えるためのID
55-
[DConnectLightProfile setLightId:SpheroLED target:led];
56-
[DConnectLightProfile setLightName:SpheroLEDName target:led];
57-
[DConnectLightProfile setLightOn:[DPSpheroManager sharedManager].isLEDOn target:led];
58-
[DConnectLightProfile setLightConfig:@"" target:led];
59-
[lights addMessage:led];
60-
61-
// CalibrationのライトをつけるためのID(ON/OFFのみ)
62-
[DConnectLightProfile setLightId:SpheroCalibration target:calibration];
63-
[DConnectLightProfile setLightName:SpheroCalibrationName target:calibration];
64-
[DConnectLightProfile setLightOn:[DPSpheroManager sharedManager].calibrationLightBright>0 target:calibration];
65-
[DConnectLightProfile setLightConfig:@"" target:calibration];
66-
[lights addMessage:calibration];
52+
if (!lightId || (lightId && [lightId isEqualToString:kDPSpheroLED])) {
53+
// 全体の色を変えるためのID
54+
[DConnectLightProfile setLightId:kDPSpheroLED target:led];
55+
[DConnectLightProfile setLightName:kDPSpheroLEDName target:led];
56+
[DConnectLightProfile setLightOn:[DPSpheroManager sharedManager].isLEDOn target:led];
57+
[DConnectLightProfile setLightConfig:@"" target:led];
58+
[lights addMessage:led];
59+
}
60+
if (!lightId || (lightId && [lightId isEqualToString:kDPSpheroCalibration])) {
61+
// CalibrationのライトをつけるためのID(ON/OFFのみ)
62+
[DConnectLightProfile setLightId:kDPSpheroCalibration target:calibration];
63+
[DConnectLightProfile setLightName:kDPSpheroCalibrationName target:calibration];
64+
[DConnectLightProfile setLightOn:[DPSpheroManager sharedManager].calibrationLightBright>0 target:calibration];
65+
[DConnectLightProfile setLightConfig:@"" target:calibration];
66+
[lights addMessage:calibration];
67+
}
6768

6869
[DConnectLightProfile setLights:lights target:response];
6970

@@ -81,7 +82,11 @@ - (id)init
8182
NSNumber *brightness = [DConnectLightProfile brightnessFromRequest: request];
8283
NSString *color = [DConnectLightProfile colorFromRequest: request];
8384
NSArray *flashing = [DConnectLightProfile parsePattern: [DConnectLightProfile flashingFromRequest: request] isId:NO];
84-
85+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
86+
if (arr.count == 2) {
87+
lightId = arr[1];
88+
serviceId = arr[0];
89+
}
8590
return [weakSelf postLightRequest:request response:response serviceId:serviceId lightId:lightId brightness:brightness color:color flashing:flashing];
8691
}];
8792

@@ -106,17 +111,16 @@ - (id)init
106111
[response setErrorToInvalidRequestParameter];
107112
return YES;
108113
}
109-
110-
if (!serviceId) {
111-
[response setErrorToEmptyServiceId];
112-
return YES;
113-
}
114-
114+
115115
if (name == nil || [name isEqualToString:@""]) {
116116
[response setErrorToInvalidRequestParameterWithMessage:@"name is invalid."];
117117
return YES;
118118
}
119-
119+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
120+
if (arr.count == 2) {
121+
serviceId = arr[0];
122+
lightId = arr[1];
123+
}
120124
return [weakSelf postLightRequest:request response:response serviceId:serviceId lightId:lightId brightness:brightness color:color flashing:flashing];
121125
}];
122126

@@ -133,19 +137,24 @@ - (id)init
133137
[response setErrorToEmptyServiceId];
134138
return YES;
135139
}
136-
140+
NSArray *arr = [serviceId componentsSeparatedByString:@"_"];
141+
if (arr.count == 2) {
142+
serviceId = arr[0];
143+
lightId = arr[1];
144+
}
145+
137146
// lightIdが省略された場合には、SpherorLEBを使用する
138147
if (!lightId) {
139-
lightId = SpheroLED;
148+
lightId = kDPSpheroLED;
140149
}
141150

142151
// 接続確認
143152
CONNECT_CHECK();
144153

145-
if ([lightId isEqualToString:SpheroCalibration]) {
154+
if ([lightId isEqualToString:kDPSpheroCalibration]) {
146155
// キャリブレーションライト消灯。
147156
[[DPSpheroManager sharedManager] setCalibrationLightBright:0 serviceId:serviceId];
148-
} else if ([lightId isEqualToString:SpheroLED]) {
157+
} else if ([lightId isEqualToString:kDPSpheroLED]) {
149158
// LED消灯
150159
[[DPSpheroManager sharedManager] setLEDLightColor:[UIColor blackColor] serviceId:serviceId];
151160
} else {
@@ -188,15 +197,15 @@ -(BOOL) postLightRequest:(DConnectRequestMessage *)request
188197

189198
// lightIdが省略された場合には、SpherorLEDを使用する
190199
if (!lightId) {
191-
lightId = SpheroLED;
200+
lightId = kDPSpheroLED;
192201
}
193202

194203
// 接続確認
195204
CONNECT_CHECK();
196205

197206
// lightId確認
198-
if (![lightId isEqualToString:SpheroCalibration] &&
199-
![lightId isEqualToString:SpheroLED]) {
207+
if (![lightId isEqualToString:kDPSpheroCalibration] &&
208+
![lightId isEqualToString:kDPSpheroLED]) {
200209
[response setErrorToInvalidRequestParameterWithMessage:@"lightId is Invalid."];
201210
return YES;
202211
}
@@ -209,7 +218,7 @@ -(BOOL) postLightRequest:(DConnectRequestMessage *)request
209218
return YES;
210219
}
211220

212-
if ([lightId isEqualToString:SpheroCalibration]) {
221+
if ([lightId isEqualToString:kDPSpheroCalibration]) {
213222
// キャリブレーションライト点灯。 colorは変えられない。点灯、消灯のみ
214223
if (flashing.count > 0) {
215224
// 点滅
@@ -222,7 +231,7 @@ -(BOOL) postLightRequest:(DConnectRequestMessage *)request
222231
// 点灯
223232
[[DPSpheroManager sharedManager] setCalibrationLightBright:[brightness doubleValue] serviceId:serviceId];
224233
}
225-
} else if ([lightId isEqualToString:SpheroLED]) {
234+
} else if ([lightId isEqualToString:kDPSpheroLED]) {
226235
// LED点灯
227236
UIColor *ledColor;
228237
if (color) {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// DPSpheroLightService.h
3+
// dConnectDeviceSphero
4+
//
5+
// Copyright (c) 2016 NTT DOCOMO, INC.
6+
// Released under the MIT license
7+
// http://opensource.org/licenses/mit-license.php
8+
//
9+
10+
11+
#import <DConnectSDK/DConnectService.h>
12+
13+
@interface DPSpheroLightService : DConnectService<DConnectServiceInformationProfileDataSource>
14+
15+
- (instancetype) initWithServiceId:(NSString *)serviceId
16+
lightId:(NSString *)lightId
17+
deviceName: (NSString *) deviceName
18+
plugin: (id) plugin;
19+
20+
@end
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// DPSpheroLightService.m
3+
// dConnectDeviceSphero
4+
//
5+
// Copyright (c) 2016 NTT DOCOMO, INC.
6+
// Released under the MIT license
7+
// http://opensource.org/licenses/mit-license.php
8+
//
9+
10+
11+
#import "DPSpheroLightService.h"
12+
#import "DPSpheroLightProfile.h"
13+
14+
@implementation DPSpheroLightService
15+
16+
- (instancetype) initWithServiceId:(NSString *)serviceId
17+
lightId:(NSString *)lightId
18+
deviceName: (NSString *) deviceName
19+
plugin: (id) plugin {
20+
NSString *serviceIdForLight = [NSString stringWithFormat:@"%@_%@", serviceId, lightId];
21+
self = [super initWithServiceId: serviceIdForLight plugin: plugin];
22+
if (self) {
23+
[self setName: deviceName];
24+
[self setNetworkType: DConnectServiceDiscoveryProfileNetworkTypeBluetooth];
25+
[self setOnline: YES];
26+
27+
// Sphero Profileの追加
28+
[self addProfile:[DPSpheroLightProfile new]];
29+
}
30+
return self;
31+
}
32+
33+
#pragma mark - DConnectServiceInformationProfileDataSource Implement.
34+
35+
- (DConnectServiceInformationProfileConnectState)profile:(DConnectServiceInformationProfile *)profile
36+
bluetoothStateForServiceId:(NSString *)serviceId {
37+
38+
DConnectServiceInformationProfileConnectState bluetoothState;
39+
if (self.online) {
40+
bluetoothState = DConnectServiceInformationProfileConnectStateOn;
41+
} else {
42+
bluetoothState = DConnectServiceInformationProfileConnectStateOff;
43+
}
44+
return bluetoothState;
45+
}
46+
47+
48+
@end

dConnectDevicePlugin/dConnectDeviceSphero/dConnectDeviceSphero/Classes/DPSpheroManager.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ typedef struct DPQuaternion_ {
3232
typedef struct DPGyroData_ {
3333
double x, y, z;
3434
} DPGyroData;
35+
//LEDは色を変えられる
36+
extern NSString *const kDPSpheroLED;
37+
extern NSString *const kDPSpheroLEDName;
38+
//Calibrationは色を変えられない
39+
extern NSString *const kDPSpheroCalibration;
40+
extern NSString *const kDPSpheroCalibrationName;
3541

3642
/*!
3743
@brief Spheroのセンサー処理用デリゲート。

dConnectDevicePlugin/dConnectDeviceSphero/dConnectDeviceSphero/Classes/DPSpheroManager.m

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@
1313
#import <RobotKit/RobotKit.h>
1414
#import <DConnectSDK/DConnectService.h>
1515
#import "DPSpheroService.h"
16+
#import "DPSpheroLightService.h"
1617

18+
//LEDは色を変えられる
19+
NSString *const kDPSpheroLED = @"1";
20+
NSString *const kDPSpheroLEDName = @"Sphero LED";
21+
//Calibrationは色を変えられない
22+
NSString *const kDPSpheroCalibration = @"2";
23+
NSString *const kDPSpheroCalibrationName = @"Sphero CalibrationLED";
1724

1825
// センサー監視間隔(400Hz/kSensorDivisor)
1926
static int const kSensorDivisor = 40;
@@ -179,6 +186,33 @@ - (void) updateManageServices {
179186
[self.serviceProvider addService: service];
180187
[service setOnline: isOnline];
181188
}
189+
NSString *serviceIdForLED = [NSString stringWithFormat:@"%@_%@", serviceId, kDPSpheroLED];
190+
NSLog(@"update light name:%@", serviceIdForLED);
191+
192+
DConnectService *led = [self.serviceProvider service: serviceIdForLED];
193+
if (led) {
194+
[led setOnline: isOnline];
195+
} else {
196+
led = [[DPSpheroLightService alloc] initWithServiceId:serviceId
197+
lightId:kDPSpheroLED
198+
deviceName:kDPSpheroLEDName
199+
plugin: self.plugin];
200+
[self.serviceProvider addService: led];
201+
[led setOnline: isOnline];
202+
}
203+
NSString *serviceIdForCalibration = [NSString stringWithFormat:@"%@_%@", serviceId, kDPSpheroCalibration];
204+
DConnectService *calibration = [self.serviceProvider service: serviceIdForCalibration];
205+
NSLog(@"update light name:%@", serviceIdForCalibration);
206+
if (calibration) {
207+
[calibration setOnline: isOnline];
208+
} else {
209+
calibration = [[DPSpheroLightService alloc] initWithServiceId:serviceId
210+
lightId:kDPSpheroCalibration
211+
deviceName:kDPSpheroCalibrationName
212+
plugin: self.plugin];
213+
[self.serviceProvider addService: calibration];
214+
[calibration setOnline: isOnline];
215+
}
182216
}
183217
}
184218
}

0 commit comments

Comments
 (0)