diff --git a/lib/src/components/generic/client.dart b/lib/src/components/generic/client.dart new file mode 100644 index 0000000000..aa1f4e2cae --- /dev/null +++ b/lib/src/components/generic/client.dart @@ -0,0 +1,26 @@ +import 'package:grpc/grpc_connection_interface.dart'; + +import '../../gen/common/v1/common.pb.dart'; +import '../../gen/component/generic/v1/generic.pbgrpc.dart'; +import '../../resource/base.dart'; +import '../../utils.dart'; +import 'generic.dart'; + +class GenericClient extends Generic implements ResourceRPCClient { + @override + ClientChannelBase channel; + + @override + String name; + + @override + GenericServiceClient get client => GenericServiceClient(channel); + + GenericClient(this.name, this.channel); + + @override + Future> doCommand(Map command) async { + final response = await client.doCommand(DoCommandRequest(name: name, command: command.toStruct())); + return response.result.toMap(); + } +} diff --git a/lib/src/components/generic/generic.dart b/lib/src/components/generic/generic.dart new file mode 100644 index 0000000000..4c8cf5592a --- /dev/null +++ b/lib/src/components/generic/generic.dart @@ -0,0 +1,22 @@ +import '../../gen/common/v1/common.pb.dart'; +import '../../resource/base.dart'; +import '../../robot/client.dart'; + +/// Generic component, which represents any type of component that can executes arbitrary commands +abstract class Generic extends Resource { + static const Subtype subtype = Subtype(resourceNamespaceRDK, resourceTypeComponent, 'generic'); + + /// Convenience method to allow component clients to execute ``do_command`` functions + @override + Future> doCommand(Map command); + + /// Get the [ResourceName] for this [Generic] with the given [name] + static ResourceName getResourceName(String name) { + return Generic.subtype.getResourceName(name); + } + + /// Get the [Generic] named [name] from the provided robot. + static Generic fromRobot(RobotClient robot, String name) { + return robot.getResource(Generic.getResourceName(name)); + } +} diff --git a/lib/src/resource/registry.dart b/lib/src/resource/registry.dart index b6cea507c0..121f0e4b41 100644 --- a/lib/src/resource/registry.dart +++ b/lib/src/resource/registry.dart @@ -10,6 +10,8 @@ import '../components/camera/camera.dart'; import '../components/camera/client.dart'; import '../components/gantry/client.dart'; import '../components/gantry/gantry.dart'; +import '../components/generic/client.dart'; +import '../components/generic/generic.dart'; import '../components/motor/client.dart'; import '../components/motor/motor.dart'; import '../components/movement_sensor/client.dart'; @@ -36,6 +38,7 @@ class Registry { registerSubtype(ResourceRegistration(Base.subtype, (name, channel) => BaseClient(name, channel))); registerSubtype(ResourceRegistration(Camera.subtype, (name, channel) => CameraClient(name, channel))); registerSubtype(ResourceRegistration(Gantry.subtype, (name, channel) => GantryClient(name, channel))); + registerSubtype(ResourceRegistration(Generic.subtype, (name, channel) => GenericClient(name, channel))); registerSubtype(ResourceRegistration(Motor.subtype, (name, channel) => MotorClient(name, channel))); registerSubtype(ResourceRegistration(MovementSensor.subtype, (name, channel) => MovementSensorClient(name, channel))); registerSubtype(ResourceRegistration(Sensor.subtype, (name, channel) => SensorClient(name, channel)));