Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/app/scopes/flows/selected_data_source_scope.dart
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,12 @@ class SelectedDataSourceScope extends AutoRouter {
);
},
),
BlocProvider(
create: (context) => ChangeGearBloc(
dataSource: context.read(),
generalDataCubit: context.read(),
),
),
BlocProvider(
create: (context) =>
LaunchAppCubit(appsService: context.read()),
Expand Down
96 changes: 62 additions & 34 deletions lib/data/services/data_source/demo_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -364,15 +364,43 @@ class DemoDataSource extends DataSource
const DataSourceParameterId.gearAndRoll4(),
},
respondCallback: (id, version, manager, [package]) {
final randomGear =
MotorGear.values[Random().nextInt(MotorGear.values.length)];
final randomRoll = MotorRollDirection
.values[Random().nextInt(MotorRollDirection.values.length)];
return manager.updateCallback(
id,
MotorGearAndRoll(
gear: randomGear,
rollDirection: randomRoll,
// gear: MotorGear.random,
gear: MotorGear.drive,
rollDirection: MotorRollDirection.random,
status: _getRandomStatus,
),
version,
);
},
),
MainEcuMockResponseWrapper(
ids: {
const DataSourceParameterId.transmission1(),
const DataSourceParameterId.transmission2(),
const DataSourceParameterId.transmission3(),
const DataSourceParameterId.transmission4(),
},
unavailableForSubscriptionIds: {},
respondCallback: (id, version, manager, [package]) {
final expectedGearId = package.checkNotNull('Packet').data.last;
manager.updateCallback(
id,
Uint8WithStatusBody(
value: expectedGearId,
status: PeriodicValueStatus.normal,
),
version,
);
final gap = const DataSourceParameterId.transmission1().value -
const DataSourceParameterId.gearAndRoll1().value;
return manager.updateCallback(
DataSourceParameterId.fromInt(id.value - gap),
MotorGearAndRoll(
gear: MotorGear.fromId(expectedGearId),
rollDirection: MotorRollDirection.random,
status: _getRandomStatus,
),
version,
Expand Down Expand Up @@ -520,14 +548,14 @@ class DemoDataSource extends DataSource
return const Result.value(null);
},
),
MainEcuMockResponseWrapper(
ids: {const CustomImageParameterId()},
respondCallback: (id, version, manager, [package]) async {
await _sendSetUint8ResultCallback(id, version, package?.data[1]);

return const Result.value(null);
},
),
// MainEcuMockResponseWrapper(
// ids: {const CustomImageParameterId()},
// respondCallback: (id, version, manager, [package]) async {
// await _sendSetUint8ResultCallback(id, version, package?.data[1]);

// return const Result.value(null);
// },
// ),
MainEcuMockResponseUpdateCallbackWrapper(
ids: {const CustomParameterId(0x00E0)},
convertible: PlainBytesConvertible(
Expand Down Expand Up @@ -598,26 +626,26 @@ class DemoDataSource extends DataSource
);
}

Future<void> _sendSetUint8ResultCallback(
DataSourceParameterId parameterId,
DataSourceProtocolVersion version, [
int? requiredResult,
]) async {
await Future<void>.delayed(const Duration(milliseconds: 100));
final _requiredResult = requiredResult ?? randomUint8;

await _updateValueCallback(
parameterId,
SuccessEventUint8Body(
generateRandomErrors()
? randomBool
? randomUint8
: _requiredResult
: _requiredResult,
),
version,
);
}
// Future<void> _sendSetUint8ResultCallback(
// DataSourceParameterId parameterId,
// DataSourceProtocolVersion version, [
// int? requiredResult,
// ]) async {
// await Future<void>.delayed(const Duration(milliseconds: 100));
// final _requiredResult = requiredResult ?? randomUint8;

// await _updateValueCallback(
// parameterId,
// SuccessEventUint8Body(
// generateRandomErrors()
// ? randomBool
// ? randomUint8
// : _requiredResult
// : _requiredResult,
// ),
// version,
// );
// }

void _sendPackage(DataSourceIncomingPackage package) {
if (controller.isClosed) return;
Expand Down
70 changes: 70 additions & 0 deletions lib/domain/data_source/blocs/change_gear_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:pixel_app_flutter/domain/data_source/data_source.dart';
import 'package:pixel_app_flutter/domain/data_source/models/package/outgoing/outgoing_data_source_packages.dart';
import 'package:pixel_app_flutter/domain/data_source/models/package_data/package_data.dart';
import 'package:re_seedwork/re_seedwork.dart';

part 'change_gear_bloc.freezed.dart';

@freezed
class ChangeGearEvent extends EffectEvent with _$ChangeGearEvent {
const factory ChangeGearEvent.change(MotorGear newGear) = _Change;
}

typedef ChangeGearState = AsyncData<MotorGear, Object>;

class ChangeGearBloc extends Bloc<ChangeGearEvent, ChangeGearState>
with BlocEventHandlerMixin {
ChangeGearBloc({
required this.dataSource,
required this.generalDataCubit,
}) : super(const ChangeGearState.initial(MotorGear.unknown)) {
on<_Change>(_onChange);
}

@visibleForTesting
static const List<DataSourceParameterId> kParameterIds = [
DataSourceParameterId.transmission1(),
DataSourceParameterId.transmission2(),
DataSourceParameterId.transmission3(),
DataSourceParameterId.transmission4(),
];

@protected
final DataSource dataSource;

@protected
final GeneralDataCubit generalDataCubit;

Future<void> _onChange(
_Change event,
Emitter<AsyncData<MotorGear, Object>> emit,
) async {
emit(AsyncData.loading(event.newGear));

try {
final future = generalDataCubit.stream
.firstWhere((element) => element.mergedGear == event.newGear)
.timeout(const Duration(seconds: 2));
for (final parameterId in kParameterIds) {
final res = await dataSource.sendPackage(
OutgoingSetValuePackage(
parameterId: parameterId,
setValueBody: SetInt8Body(value: event.newGear.id),
),
);
if (res.isError) {
return emit(AsyncData.failure(generalDataCubit.state.mergedGear));
}
}
await future;

emit(AsyncData.success(event.newGear));
} on Object catch (_) {
emit(AsyncData.failure(generalDataCubit.state.mergedGear));

rethrow;
}
}
}
1 change: 1 addition & 0 deletions lib/domain/data_source/data_source.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// blocs
export 'blocs/battery_data_cubit.dart';
export 'blocs/change_gear_bloc.dart';
export 'blocs/data_source_authorization_cubit.dart';
export 'blocs/data_source_connect_bloc.dart';
export 'blocs/data_source_connection_status_cubit.dart';
Expand Down
Loading
Loading