diff options
7 files changed, 132 insertions, 115 deletions
diff --git a/lib/core/constants/constants.dart b/lib/core/constants/constants.dart index 5d79b5a..03c1f8a 100644 --- a/lib/core/constants/constants.dart +++ b/lib/core/constants/constants.dart @@ -10,6 +10,7 @@ const maxRpm = 8000; final GlobalKey<ScaffoldState> homeScaffoldKey = GlobalKey(); const debugDisplay = bool.fromEnvironment('DEBUG_DISPLAY'); const disableBkgAnimation = bool.fromEnvironment('DISABLE_BKG_ANIMATION'); +const randomHybridAnimation = bool.fromEnvironment('RANDOM_HYBRID_ANIMATION'); diff --git a/lib/data/data_providers/app_provider.dart b/lib/data/data_providers/app_provider.dart index f6fb1ad..fb0a447 100644 --- a/lib/data/data_providers/app_provider.dart +++ b/lib/data/data_providers/app_provider.dart @@ -54,7 +54,8 @@ final usersProvider = StateNotifierProvider<UsersNotifier, Users>((ref) { return UsersNotifier(Users.initial()); }); -final hybridtateProvider = StateNotifierProvider<HybridNotifier, Hybrid>((ref) { +final hybridStateProvider = + StateNotifierProvider<HybridNotifier, Hybrid>((ref) { return HybridNotifier(const Hybrid.initial()); }); @@ -62,3 +63,4 @@ final currentTimeProvider = StateNotifierProvider<CurrentTimeNotifier, DateTime>((ref) { return CurrentTimeNotifier(); }); + diff --git a/lib/data/data_providers/hybrid_notifier.dart b/lib/data/data_providers/hybrid_notifier.dart index fd16a68..3668f61 100644 --- a/lib/data/data_providers/hybrid_notifier.dart +++ b/lib/data/data_providers/hybrid_notifier.dart @@ -43,7 +43,7 @@ class HybridNotifier extends StateNotifier<Hybrid> { state = state.copyWith(hybridState: hybridState); } - void updateHybridState() { + void updateHybridState(double speed, double engineSpeed, bool brake) { // Variable to store the current state HybridState currentState = state.hybridState; @@ -56,38 +56,25 @@ class HybridNotifier extends StateNotifier<Hybrid> { // Variable for storing the average value of RPM double avgRpm = 0.0; - // Variable to store the brake value state - bool brake = false; - - // Collect 10 samples - for (int i = 0; i < 10; i++) { - // Get the current values for speed, engine rpm and brake status - - // speed = vehicleProvider(); - // rpm = _rpmFromServer(); - // brake = _brakeFromServer(); - - // Calculate the average speed value - // avgSpeed = (avgSpeed * (i + 1) + speed) / (i + 2); - - // Calculate the average engine rpm - // avgRpm = (avgRpm * (i + 1) + rpm) / (i + 2); + + if (speed == 0 && engineSpeed == 0) { + // Set idle state. + currentState = HybridState.idle; + } else if (engineSpeed > 0 && speed > 0) { + // Set stan na engine output state.. + currentState = HybridState.engineOutput; + } else if (speed < 0 && brake) { + // Set regenerative breaking state + currentState = HybridState.regenerativeBreaking; + } else if (speed > 0 && engineSpeed <= 0) { + // Set battery output state + currentState = HybridState.baterryOutput; } - // define new state - // if (avgSpeed == 0 && avgRpm == 0) { - // currentState = HybridState.idle; - // } else if (avgRpm > 0 && avgSpeed > 0) { - // currentState = HybridState.engineOutput; - // } else if (avgRpm == 0 && brake) { - // currentState = HybridState.regenerativeBreaking; - // } else if (avgSpeed > 0 && avgRpm <= avgSpeed) { - // currentState = HybridState.baterryOutput; - // } - // Update hybrid state if (currentState != previousState) { - state = state.copyWith(hybridState: currentState); + //state = state.copyWith(hybridState: currentState); + setHybridState(currentState); } } } diff --git a/lib/presentation/screens/dashboard/widgets/child_lock.dart b/lib/presentation/screens/dashboard/widgets/child_lock.dart index b8701d7..c495fca 100644 --- a/lib/presentation/screens/dashboard/widgets/child_lock.dart +++ b/lib/presentation/screens/dashboard/widgets/child_lock.dart @@ -16,33 +16,41 @@ class ChildLockLeft extends ConsumerWidget { debugPrint('Tapped child lock left'); ref.read(vehicleProvider.notifier).setChildLock(side: 'left'); }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - const Text( - 'Child Lock', - style: TextStyle( - fontSize: 26, // Set the font size to 26 - ), - ), - Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Icon( - isChildLockActiveLeft ? Icons.lock : Icons.lock_open, - color: isChildLockActiveLeft ? Colors.white : Colors.redAccent, - size: 16, + child: Container( + height: 120, + width: 150, + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Child Lock', + style: TextStyle( + fontSize: 26, // Set the font size to 26 ), - Text( - isChildLockActiveLeft ? 'Activated' : 'Unlocked', - style: TextStyle( - color: isChildLockActiveLeft ? Colors.white : Colors.redAccent, - fontSize: 26, // Set the font size to 26 + ), + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Icon( + isChildLockActiveLeft ? Icons.lock : Icons.lock_open, + color: + isChildLockActiveLeft ? Colors.white : Colors.redAccent, + size: 16, ), - ), - ], - ), - ], + Text( + isChildLockActiveLeft ? 'Activated' : 'Unlocked', + style: TextStyle( + color: + isChildLockActiveLeft ? Colors.white : Colors.redAccent, + fontSize: 26, // Set the font size to 26 + ), + ), + ], + ), + ], + ), ), ); } @@ -63,33 +71,42 @@ class ChildLockRight extends ConsumerWidget { debugPrint('Tapped child lock right'); ref.read(vehicleProvider.notifier).setChildLock(side: 'right'); }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - 'Child Lock', - style: TextStyle( - fontSize: 26, // Set the font size to 26 + child: Container( + height: 120, + width: 150, + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Child Lock', + style: TextStyle( + fontSize: 26, // Set the font size to 26 + ), ), - ), - Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text( - isChildLockActiveRight ? 'Activated' : 'Unlocked', - style: TextStyle( - color: isChildLockActiveRight ? Colors.white : Colors.redAccent, - fontSize: 26, // Set the font size to 26 + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + isChildLockActiveRight ? 'Activated' : 'Unlocked', + style: TextStyle( + color: isChildLockActiveRight + ? Colors.white + : Colors.redAccent, + fontSize: 26, // Set the font size to 26 + ), ), - ), - Icon( - isChildLockActiveRight ? Icons.lock : Icons.lock_open, - color: isChildLockActiveRight ? Colors.white : Colors.redAccent, - size: 16, - ), - ], - ), - ], + Icon( + isChildLockActiveRight ? Icons.lock : Icons.lock_open, + color: + isChildLockActiveRight ? Colors.white : Colors.redAccent, + size: 16, + ), + ], + ), + ], + ), ), ); } diff --git a/lib/presentation/screens/dashboard/widgets/dashboard_content.dart b/lib/presentation/screens/dashboard/widgets/dashboard_content.dart index 74f0d2a..28cf944 100644 --- a/lib/presentation/screens/dashboard/widgets/dashboard_content.dart +++ b/lib/presentation/screens/dashboard/widgets/dashboard_content.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:math'; import 'package:flutter_ics_homescreen/export.dart'; @@ -14,6 +15,7 @@ class DashBoardState extends ConsumerState<DashBoard> late AnimationController _animationController; late Animation<double> _animation; static bool _isAnimationPlayed = false; + late Timer timer; @override void initState() { @@ -36,11 +38,21 @@ class DashBoardState extends ConsumerState<DashBoard> _isAnimationPlayed = true; }); } + + if (randomHybridAnimation) { + timer = Timer.periodic(const Duration(seconds: 5), (timer) { + Random random = Random(); + int randomState = random.nextInt(4); + var hybridState = HybridState.values[randomState]; + ref.read(hybridStateProvider.notifier).setHybridState(hybridState); + }); + } } @override void dispose() { _animationController.dispose(); + timer.cancel(); super.dispose(); } @@ -58,11 +70,11 @@ class DashBoardState extends ConsumerState<DashBoard> Widget fadeContent = FadeTransition( opacity: _animation, - child: Column( + child: const Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ - const Row( + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, //mainAxisSize: MainAxisSize.max, children: [ @@ -71,24 +83,15 @@ class DashBoardState extends ConsumerState<DashBoard> FuelProgressIndicator(), ], ), - GestureDetector( - onTap: () { - Random random = Random(); - int randomState = random.nextInt(4); - var hybridState = HybridState.values[randomState]; - ref - .read(hybridtateProvider.notifier) - .setHybridState(hybridState); - }, - child: const HybridModel()), - const Row( + HybridModel(), + Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TemperatureWidget(), RangeWidget(), ], ), - const CarStatus(), + CarStatus(), ], )); diff --git a/lib/presentation/screens/dashboard/widgets/hybrid/hybrid.dart b/lib/presentation/screens/dashboard/widgets/hybrid/hybrid.dart index b6844de..6badf62 100644 --- a/lib/presentation/screens/dashboard/widgets/hybrid/hybrid.dart +++ b/lib/presentation/screens/dashboard/widgets/hybrid/hybrid.dart @@ -21,7 +21,7 @@ class TopArrow extends StatelessWidget { return Align( alignment: const Alignment(0, -0.75), child: Consumer(builder: (context, ref, child) { - final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid)); + final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid)); Widget? widget; switch (state.topArrowState) { case ArrowState.blue: @@ -56,7 +56,7 @@ class LeftArrow extends StatelessWidget { return Align( alignment: const Alignment(-0.7, 0.5), child: Consumer(builder: (context, ref, child) { - final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid)); + final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid)); Widget? widget; switch (state.leftArrowState) { case ArrowState.blue: @@ -92,7 +92,7 @@ class RightArrow extends StatelessWidget { return Align( alignment: const Alignment(0.70, 0.5), child: Consumer(builder: (context, ref, child) { - final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid)); + final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid)); Widget? widget; switch (state.rightArrowState) { @@ -131,7 +131,7 @@ class BatteryHybrid extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final batteryState = - ref.watch(hybridtateProvider.select((hybrid) => hybrid.batteryState)); + ref.watch(hybridStateProvider.select((hybrid) => hybrid.batteryState)); return Align( alignment: const Alignment(0, 0.8), child: SvgPicture.asset( diff --git a/lib/presentation/screens/dashboard/widgets/hybrid_mode.dart b/lib/presentation/screens/dashboard/widgets/hybrid_mode.dart index 9a657b8..f5f1286 100644 --- a/lib/presentation/screens/dashboard/widgets/hybrid_mode.dart +++ b/lib/presentation/screens/dashboard/widgets/hybrid_mode.dart @@ -1,29 +1,36 @@ import 'package:flutter_ics_homescreen/export.dart'; -class HybridModel extends StatefulWidget { +class HybridModel extends ConsumerStatefulWidget { const HybridModel({super.key}); @override - State<HybridModel> createState() => _HybridModelState(); + HybridModelState createState() => HybridModelState(); } -class _HybridModelState extends State<HybridModel> { +class HybridModelState extends ConsumerState<HybridModel> { + @override Widget build(BuildContext context) { - - return GestureDetector( - child: const SizedBox( - width: 500, - height: 500, - child: Stack( - children: [ - HybridBackround(), - TopArrow(), - LeftArrow(), - RightArrow(), - BatteryHybrid(), - ], - ), + if (!randomHybridAnimation) { + ref.listen<Vehicle>(vehicleProvider, (Vehicle? previous, Vehicle next) { + ref.watch(hybridStateProvider.notifier).updateHybridState( + next.speed, + next.engineSpeed, + false); //TODO get brake value and improve state logic + }); + } + + return const SizedBox( + width: 500, + height: 500, + child: Stack( + children: [ + HybridBackround(), + TopArrow(), + LeftArrow(), + RightArrow(), + BatteryHybrid(), + ], ), ); } |