Skip to content

Commit 5d442c7

Browse files
RSDK-9622: Add Discover Service and GetModelsFromModules to Flutter (#321)
* add discovery service * register and add tests * add module models * change to discoveries * update with latest api changes * fix mocks * fix import' * import common to discovery.dart * remove content of test * readd test * export discovery client --------- Co-authored-by: Naveed Jooma <naveed@viam.com>
1 parent 4c4b202 commit 5d442c7

File tree

7 files changed

+4257
-4544
lines changed

7 files changed

+4257
-4544
lines changed

lib/src/resource/registry.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import '../components/sensor/sensor.dart';
2525
import '../components/servo/client.dart';
2626
import '../components/servo/servo.dart';
2727
import '../resource/base.dart';
28+
import '../services/discovery.dart';
2829
import '../services/vision.dart';
2930

3031
/// {@category Viam SDK}
@@ -69,6 +70,7 @@ class Registry {
6970
registerSubtype(ResourceRegistration(Sensor.subtype, (name, channel) => SensorClient(name, channel)));
7071
registerSubtype(ResourceRegistration(Servo.subtype, (name, channel) => ServoClient(name, channel)));
7172
registerSubtype(ResourceRegistration(VisionClient.subtype, (name, channel) => VisionClient(name, channel)));
73+
registerSubtype(ResourceRegistration(DiscoveryClient.subtype, (name, channel) => DiscoveryClient(name, channel)));
7274
}
7375

7476
/// The [Subtype] available in the SDK

lib/src/robot/client.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:grpc/grpc_connection_interface.dart';
55
import 'package:logger/logger.dart';
66

77
import '../gen/common/v1/common.pb.dart';
8+
import '../gen/robot/v1/robot.pb.dart';
89
import '../gen/google/protobuf/struct.pb.dart';
910
import '../gen/robot/v1/robot.pbgrpc.dart' as rpb;
1011
import '../gen/stream/v1/stream.pbgrpc.dart';
@@ -349,4 +350,15 @@ class RobotClient {
349350
final response = await _client.discoverComponents(request);
350351
return response.discovery.map((d) => Discovery.fromProto(d)).toList();
351352
}
353+
354+
/// GetModelsFromModules returns the list of models supported in modules on the machine.
355+
///
356+
/// ```
357+
/// var modelsFromModules = await machine.getModelsFromModules();
358+
/// ```
359+
Future<List<ModuleModel>> getModelsFromModules() async {
360+
final request = rpb.GetModelsFromModulesRequest();
361+
final response = await _client.getModelsFromModules(request);
362+
return response.models;
363+
}
352364
}

lib/src/services/discovery.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import 'package:grpc/grpc_connection_interface.dart';
2+
3+
import '../../protos/common/common.dart';
4+
import '../gen/common/v1/common.pb.dart';
5+
import '../../protos/service/discovery.dart';
6+
import '../gen/service/discovery/v1/discovery.pbgrpc.dart';
7+
import '../gen/app/v1/robot.pb.dart';
8+
import '../resource/base.dart';
9+
import '../robot/client.dart';
10+
import '../utils.dart';
11+
12+
/// {@category Services}
13+
class DiscoveryClient extends Resource implements ResourceRPCClient {
14+
static const Subtype subtype = Subtype(resourceNamespaceRDK, resourceTypeService, 'discovery');
15+
16+
@override
17+
final String name;
18+
19+
@override
20+
ClientChannelBase channel;
21+
22+
@override
23+
DiscoveryServiceClient get client => DiscoveryServiceClient(channel);
24+
25+
DiscoveryClient(this.name, this.channel);
26+
27+
/// Returns a list of [ComponentConfig]s for all discovered viam resources connected to the viam-server machine.
28+
///
29+
/// ```
30+
/// // Example:
31+
/// var resources = await myDiscoveryService.discoverResources('myWebcam');
32+
/// ```
33+
Future<List<ComponentConfig>> discoverResources(String discoveryName, {Map<String, dynamic>? extra}) async {
34+
final request = DiscoverResourcesRequest(name: name, extra: extra?.toStruct());
35+
final response = await client.discoverResources(request);
36+
return response.discoveries;
37+
}
38+
39+
@override
40+
Future<Map<String, dynamic>> doCommand(Map<String, dynamic> command) async {
41+
final request = DoCommandRequest()
42+
..name = name
43+
..command = command.toStruct();
44+
final response = await client.doCommand(request);
45+
return response.result.toMap();
46+
}
47+
48+
/// Get the [ResourceName] for this [DiscoveryClient] with the given [name]
49+
static ResourceName getResourceName(String name) {
50+
return DiscoveryClient.subtype.getResourceName(name);
51+
}
52+
53+
/// Get the [DiscoveryClient] named [name] from the provided robot.
54+
static DiscoveryClient fromRobot(RobotClient robot, String name) {
55+
return robot.getResource(DiscoveryClient.getResourceName(name));
56+
}
57+
}

lib/viam_sdk.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export 'src/robot/client.dart';
5252
export 'src/rpc/dial.dart';
5353

5454
/// Services
55+
export 'src/services/discovery.dart';
5556
export 'src/services/vision.dart';
5657

5758
/// Misc

test/unit_test/mocks/service_clients_mocks.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:viam_sdk/src/gen/app/v1/robot.pbgrpc.dart' as app_robot;
99
import 'package:viam_sdk/src/gen/provisioning/v1/provisioning.pbgrpc.dart';
1010
import 'package:viam_sdk/src/gen/robot/v1/robot.pbgrpc.dart';
1111
import 'package:viam_sdk/src/gen/service/vision/v1/vision.pbgrpc.dart';
12+
import 'package:viam_sdk/src/gen/service/discovery/v1/discovery.pbgrpc.dart';
1213

1314
@GenerateNiceMocks([
1415
MockSpec<ClientChannelBase>(),
@@ -21,5 +22,6 @@ import 'package:viam_sdk/src/gen/service/vision/v1/vision.pbgrpc.dart';
2122
MockSpec<BillingServiceClient>(),
2223
MockSpec<MLTrainingServiceClient>(),
2324
MockSpec<DatasetServiceClient>(),
25+
MockSpec<DiscoveryServiceClient>(),
2426
])
2527
void main() {}

0 commit comments

Comments
 (0)