Skip to content

Commit e882c7b

Browse files
authored
Convert sensor reading values to types (#294)
1 parent 254be4b commit e882c7b

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

lib/src/components/movement_sensor/client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MovementSensorClient extends MovementSensor implements ResourceRPCClient {
2727
..name = name
2828
..extra = extra?.toStruct() ?? Struct();
2929
final response = await client.getReadings(request);
30-
return response.readings.map((key, value) => MapEntry(key, value.toPrimitive()));
30+
return response.toPrimitive();
3131
}
3232

3333
@override

lib/src/components/sensor/client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class SensorClient extends Sensor implements ResourceRPCClient {
2727
..name = name
2828
..extra = extra?.toStruct() ?? Struct();
2929
final response = await client.getReadings(request);
30-
return response.readings.map((key, value) => MapEntry(key, value.toPrimitive()));
30+
return response.toPrimitive();
3131
}
3232

3333
@override

lib/src/utils.dart

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:fixnum/fixnum.dart';
22
import 'package:grpc/grpc.dart';
33
import 'package:logger/logger.dart';
44

5+
import 'gen/app/v1/robot.pb.dart';
6+
import 'gen/common/v1/common.pb.dart';
57
import 'gen/google/protobuf/duration.pb.dart' as grpc_duration;
68
import 'gen/google/protobuf/struct.pb.dart';
79

@@ -92,6 +94,27 @@ grpc_duration.Duration durationToProto(Duration duration) {
9294
..nanos = micros * 1000;
9395
}
9496

97+
extension GetReadingsResponseUtils on GetReadingsResponse {
98+
Map<String, dynamic> toPrimitive() {
99+
return readings.map((key, value) => MapEntry(key, value.toPrimitive())).map((key, value) {
100+
if (value is Map<String, dynamic> && value.keys.contains('_type')) {
101+
dynamic primValue;
102+
switch (value['_type']) {
103+
case 'euler':
104+
primValue = Orientation_EulerAngles(roll: value['roll'], pitch: value['pitch'], yaw: value['yaw']);
105+
case 'vector3':
106+
case 'angular_velocity':
107+
primValue = Vector3(x: value['x'], y: value['y'], z: value['z']);
108+
case 'geopoint':
109+
primValue = GeoPoint(latitude: value['lat'], longitude: value['lng']);
110+
}
111+
return MapEntry(key, primValue);
112+
}
113+
return MapEntry(key, value);
114+
});
115+
}
116+
}
117+
95118
String getVersionMetadata() {
96119
const String sdkVersion = 'v0.0.26';
97120
const String apiTag = 'v0.1.361';

test/unit_test/utils/utils_test.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import 'package:flutter_test/flutter_test.dart';
44
import 'package:grpc/grpc_connection_interface.dart';
5+
import 'package:viam_sdk/protos/app/robot.dart';
6+
import 'package:viam_sdk/protos/common/common.dart';
57
import 'package:viam_sdk/src/gen/google/protobuf/struct.pb.dart';
68
import 'package:viam_sdk/src/utils.dart';
79

@@ -198,5 +200,24 @@ void main() {
198200
}
199201
});
200202
});
203+
204+
group('GetReadingsResponseUtils', () {
205+
test('toPrimitive', () {
206+
final input = {
207+
'velocity': Value(structValue: {'_type': 'vector3', 'x': 1, 'y': 2, 'z': 3}.toStruct()),
208+
'geopoint': Value(structValue: {'_type': 'geopoint', 'lat': 12.3, 'lng': 45.6}.toStruct()),
209+
'angular_velocity': Value(structValue: {'_type': 'angular_velocity', 'x': 1, 'y': 2, 'z': 3}.toStruct()),
210+
'euler': Value(structValue: {'_type': 'euler', 'roll': 1, 'pitch': 2, 'yaw': 3}.toStruct()),
211+
'no_change': Value(numberValue: 182),
212+
};
213+
final response = GetReadingsResponse(readings: input);
214+
final output = response.toPrimitive();
215+
expect(output['velocity'], Vector3(x: 1, y: 2, z: 3));
216+
expect(output['geopoint'], GeoPoint(latitude: 12.3, longitude: 45.6));
217+
expect(output['angular_velocity'], Vector3(x: 1, y: 2, z: 3));
218+
expect(output['euler'], Orientation_EulerAngles(roll: 1, pitch: 2, yaw: 3));
219+
expect(output['no_change'], 182);
220+
});
221+
});
201222
});
202223
}

0 commit comments

Comments
 (0)