import '../../domain/models/sensor.dart'; import '../sources/localiser/realtime_data_client.dart'; import '../sources/localiser/sensor_client.dart'; import 'sensor_repository.dart'; class PhoenixSensorRepository implements SensorRepository { const PhoenixSensorRepository({ required this.client, required this.realtime, }); final SensorClient client; final RealtimeDataClient realtime; @override Future createSensor(String sensorId, {String? name}) async => Sensor.fromJson(await client.createSensor(sensorId, name: name)); @override Future> getSensors() async { final list = await client.getSensors(); return list.map((j) => Sensor.fromJson(j as Map)).toList(); } @override Future> getUnplacedSensors() async { final list = await client.getUnplacedSensors(); return list.map((j) => Sensor.fromJson(j as Map)).toList(); } @override Future getSensor(int id) async => Sensor.fromJson(await client.getSensor(id)); @override Future updateSensor(int id, {String? name}) async { final params = {}; if (name != null) params['name'] = name; return Sensor.fromJson(await client.updateSensor(id, params)); } @override Future deleteSensor(int id) => client.deleteSensor(id); @override Future placeSensor(int id, {required int roomId, required double x, required double y}) async => Sensor.fromJson( await client.placeSensor(id, {'room_id': roomId, 'x': x, 'y': y})); @override Future unplaceSensor(int id) async => Sensor.fromJson(await client.unplaceSensor(id)); @override Future getVersion(int id) => client.getVersion(id); @override Stream> sensorEvents() => realtime .channelMessages('sensors') .map((m) => {'event': m.event, ...m.payload}); @override Future beginCalibration(int id) async { final json = await client.beginCalibration(id); return json['samples_needed'] as int; } @override Future startStage(int id, double distance) => client.startStage(id, distance); @override Future<({double rssiRef, double pathLossExp})> finishCalibration( int id) async { final json = await client.finishCalibration(id); return ( rssiRef: (json['rssi_ref'] as num).toDouble(), pathLossExp: (json['path_loss_exp'] as num).toDouble(), ); } @override Future cancelCalibration(int id) => client.cancelCalibration(id); @override Stream<({String event, Map payload})> calibrationEvents( String sensorDeviceId) => realtime.channelMessages('calibration:$sensorDeviceId'); @override void leaveCalibrationChannel(String sensorDeviceId) => realtime.leaveChannel('calibration:$sensorDeviceId'); }