8000 Feature/descale by obiwan007 · Pull Request #155 · obiwan007/despresso · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Feature/descale #155

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Aug 28, 2023
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
2 changes: 1 addition & 1 deletion android/local.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
flutter.buildMode=debug
flutter.buildMode=release
flutter.versionName=1.0.11
flutter.versionCode=1
flutter.minSdkVersion=21
Expand Down
16 changes: 8 additions & 8 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,13 @@ PODS:
- SDWebImage (5.15.5):
- SDWebImage/Core (= 5.15.5)
- SDWebImage/Core (5.15.5)
- Sentry/HybridSDK (8.8.0):
- SentryPrivate (= 8.8.0)
- Sentry/HybridSDK (8.9.1):
- SentryPrivate (= 8.9.1)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.8.0)
- SentryPrivate (8.8.0)
- Sentry/HybridSDK (= 8.9.1)
- SentryPrivate (8.9.1)
- share_plus (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
Expand Down Expand Up @@ -176,7 +176,7 @@ SPEC CHECKSUMS:
battery_plus: 9bff772a7e5e4d5381ca3ca92a97373a3d8b2738
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
document_file_save_plus: 913d440d8b611ae19add4522ed578e3ed1483a2f
document_file_save_plus: 4ee6d2721c4904010bb43b5fa85b83394c1b1fc7
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_archive: 1805fdd3a695fd284b43edb53dc35ca843fb761c
Expand All @@ -193,9 +193,9 @@ SPEC CHECKSUMS:
reactive_ble_mobile: 9ce6723d37ccf701dbffd202d487f23f5de03b4c
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe
Sentry: 927dfb29d18a14d924229a59cc2ad149f43349f2
sentry_flutter: cf7da03b65520b631330ecb498deb592aa7640be
SentryPrivate: 4350d865f898224ab9fa02b37d6ee7fbb623f47e
Sentry: e3203780941722a1fcfee99e351de14244c7f806
sentry_flutter: 8f0ffd53088e6a4d50c095852c5cad9e4405025c
SentryPrivate: 5e3683390f66611fc7c6215e27645873adb55d13
share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
Expand Down
3 changes: 3 additions & 0 deletions lib/devices/decent_de1.dart
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,9 @@ class DE1 extends ChangeNotifier implements IDe1 {
case 0x06: // 6 Making hot water
service.setState(EspressoMachineState.water);
break;
case 10: // 10 Descaling
service.setState(EspressoMachineState.descale);
break;
case 0x11: // 6 Water empty
service.setState(EspressoMachineState.refill);
break;
Expand Down
6 changes: 5 additions & 1 deletion lib/model/services/ble/machine_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ class MachineState {
String subState = "";
}

enum EspressoMachineState { idle, espresso, water, steam, sleep, disconnected, connecting, refill, flush }
enum EspressoMachineState { idle, espresso, water, steam, sleep, disconnected, connecting, refill, flush, descale }

class EspressoMachineFullState {
EspressoMachineState state = EspressoMachineState.disconnected;
Expand Down Expand Up @@ -1007,6 +1007,10 @@ class EspressoMachineService extends ChangeNotifier {
void notify() {
notifyListeners();
}

Future<void> startDescaling() {
return de1!.requestState(De1StateEnum.descale);
}
}

class LineEq {
Expand Down
17 changes: 17 additions & 0 deletions lib/ui/landingpage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:despresso/model/services/state/notification_service.dart';
import 'package:despresso/model/services/state/profile_service.dart';
import 'package:despresso/model/services/state/screen_saver.dart';
import 'package:despresso/model/services/state/settings_service.dart';
import 'package:despresso/ui/screens/maintenance.dart';
import 'package:despresso/ui/screens/recipe_screen.dart';
import 'package:despresso/ui/screens/settings_screen.dart';
import 'package:despresso/service_locator.dart';
Expand Down Expand Up @@ -309,6 +310,22 @@ class LandingPageState extends State<LandingPage> with TickerProviderStateMixin
// Then close the drawer
},
),
ListTile(
leading: const Icon(Icons.build),
title: const Text("Maintenance"),
onTap: () {
_screensaver.pause();
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const MaintenanceScreen()),
).then((value) {
_screensaver.resume();
machineService.updateFlush();
});
// Then close the drawer
},
),
ListTile(
leading: const Icon(Icons.feedback),
title: Text(S.of(context).mainMenuFeedback),
Expand Down
222 changes: 222 additions & 0 deletions lib/ui/screens/maintenance.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
import 'dart:async';
import 'dart:io';

import 'package:collection/collection.dart';
import 'package:despresso/devices/abstract_scale.dart';
import 'package:despresso/devices/decent_de1.dart';
import 'package:despresso/generated/l10n.dart';
import 'package:despresso/logger_util.dart';
import 'package:despresso/model/services/ble/ble_service.dart';
import 'package:despresso/model/services/ble/machine_service.dart';
import 'package:despresso/model/services/ble/scale_service.dart';
import 'package:despresso/model/services/state/mqtt_service.dart';
import 'package:despresso/model/services/state/notification_service.dart';
import 'package:despresso/model/services/state/settings_service.dart';
import 'package:despresso/model/services/state/visualizer_service.dart';
import 'package:despresso/objectbox.dart';
import 'package:despresso/ui/widgets/screen_saver.dart';
import 'package:despresso/ui/widgets/start_stop_button.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart' as ble;
// import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:flutter_settings_screens/flutter_settings_screens.dart';
import 'package:logging/logging.dart';
import 'package:document_file_save_plus/document_file_save_plus.dart';
import 'package:network_info_plus/network_info_plus.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart' as bledevice;
import 'package:screen_brightness/screen_brightness.dart';

import '../../service_locator.dart';

class MaintenanceScreen extends StatefulWidget {
const MaintenanceScreen({Key? key}) : super(key: key);

@override
MaintenanceScreenState createState() => MaintenanceScreenState();
}

class MaintenanceScreenState extends State<MaintenanceScreen> {
final log = Logger('MaintenanceScreen');

late SettingsService settingsService;
late EspressoMachineService machineService;

@override
initState() {
super.initState();
settingsService = getIt<SettingsService>();
machineService = getIt<EspressoMachineService>();

settingsService.addListener(settingsServiceListener);

machineService.addListener(settingsServiceListener);

// _streamRefresh = machineService.streamState;
}

@override
void dispose() {
super.dispose();

settingsService.notifyDelayed();
settingsService.removeListener(settingsServiceListener);
machineService.removeListener(settingsServiceListener);

log.info('Disposed settingspage');
}

@override
Widget build(BuildContext context) {
return SettingsScreen(
title: "Maintenance",
children: [
SettingsGroup(
title: "de1 Machine Care",
children: [
SimpleSettingsTile(
title: 'Descale de1',
leading: const Icon(Icons.build),
child: SettingsScreen(
title: 'Descaling',
children: [
DescaleWidget(),
],
),
),
],
),
],
);
}

void settingsServiceListener() {
setState(() {});
updateView();
// handleAnimationState(machineService.state.coffeeState);
}

void updateView() {}
}

class DescaleWidget extends StatefulWidget {
const DescaleWidget({
super.key,
});

@override
State<DescaleWidget> createState() => _DescaleWidgetState();
}

class _DescaleWidgetState extends State<DescaleWidget> with TickerProviderStateMixin {
late Stream<int> _streamRefresh;
Logger log = Logger("Descale");
late AnimationController _animController;

late StreamController<int> _controllerRefresh;

late EspressoMachineService machineService;

@override
initState() {
super.initState();
machineService = getIt<EspressoMachineService>();
machineService.addListener(settingsServiceListener);

_controllerRefresh = StreamController<int>();
_streamRefresh = _controllerRefresh.stream.asBroadcastStream();

_animController = AnimationController(
vsync: this,
duration: const Duration(minutes: 12, seconds: 5),
)..addListener(() {
_controllerRefresh.add(0);
// setState(() {});
});
_animController.repeat();
}

@override
void dispose() {
super.dispose();
machineService.removeListener(settingsServiceListener);
_animController.dispose();
_controllerRefresh.close();
}

@override
Widget build(BuildContext context) {
return StreamBuilder<Object>(
stream: _streamRefresh,
builder: (context, snapshot) {
return SettingsContainer(
leftPadding: 16,
children: [
if (!_animController.isAnimating)
Text(
"How to prepare:",
style: Theme.of(context).textTheme.titleLarge,
),
if (!_animController.isAnimating)
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Text("Remove the trip tray and it's cover.", style: Theme.of(context).textTheme.labelLarge),
Text("In the water tank, mix 1.5 liter hot water with 300g citric acid powder.",
style: Theme.of(context).textTheme.labelLarge),
Text("Let it resolve fully.", style: Theme.of(context).textTheme.labelLarge),
Text("Put in a blind basket in the portafilter and lower the steam wand.",
style: Theme.of(context).textTheme.labelLarge),
Text("Push back the water tank. ", style: Theme.of(context).textTheme.labelLarge),
Text("Place the drip tray back without its cover.",
style: Theme.of(context).textTheme.labelLarge),
Text("You can repeat this procedure a few times if needed.",
style: Theme.of(context).textTheme.labelSmall),
Text(
"Make sure to flush the machine and steam until no acid is detectable. You could run the descale process without acid at least one time.",
style: Theme.of(context).textTheme.labelSmall),
],
),
),
if (_animController.isAnimating)
SizedBox(
height: 100,
child: Text(
"Descale in progress. Please wait.",
style: Theme.of(context).textTheme.titleLarge,
),
),
const SizedBox(
width: 300,
height: 300,
child: StartStopButton(requestedState: De1StateEnum.descale),
),
if (_animController.isAnimating)
LinearProgressIndicator(
value: _animController.value,
)
],
);
});
}

void settingsServiceListener() {
setState(() {});

handleAnimationState(machineService.state.coffeeState);
}

void handleAnimationState(EspressoMachineState state) {
if (state == EspressoMachineState.descale) {
if (_animController.isAnimating == false) {
log.info("Trigger start of animation");
_animController.forward(from: 0.0);
}
}
if (state == EspressoMachineState.idle) {
_animController.stop();
}
}
}
Loading
0