smartfarming-mobile/agrilink_vocpro/lib/features/control/view/control_screen.dart

247 lines
8.9 KiB
Dart
Raw Normal View History

2024-11-12 03:54:42 +00:00
import 'dart:math';
import 'package:agrilink_vocpro/core/constant/app_color.dart';
2024-10-01 03:49:55 +00:00
import 'package:agrilink_vocpro/core/constant/app_theme.dart';
2024-11-12 03:54:42 +00:00
import 'package:agrilink_vocpro/core/extension/extention.dart';
2024-10-02 13:07:28 +00:00
import 'package:agrilink_vocpro/core/state/result_state.dart';
2024-10-01 03:49:55 +00:00
import 'package:agrilink_vocpro/features/control/provider/control_provider.dart';
2024-10-09 04:45:19 +00:00
import 'package:agrilink_vocpro/features/control/widgets/control_button_widget.dart';
2024-11-12 03:54:42 +00:00
import 'package:agrilink_vocpro/features/control/widgets/pump_status_widget.dart';
import 'package:agrilink_vocpro/features/control/widgets/relay_status_history_widget.dart';
import 'package:bootstrap_icons/bootstrap_icons.dart';
import 'package:flutter/cupertino.dart';
2024-10-01 03:49:55 +00:00
import 'package:flutter/material.dart';
2024-10-01 07:44:18 +00:00
import 'package:flutter_screenutil/flutter_screenutil.dart';
2024-11-12 03:54:42 +00:00
import 'package:gauge_indicator/gauge_indicator.dart';
2024-10-01 03:49:55 +00:00
import 'package:provider/provider.dart';
class ControlScreen extends StatelessWidget {
const ControlScreen({super.key});
@override
Widget build(BuildContext context) {
final provider = Provider.of<ControlProvider>(context, listen: true);
2024-10-01 03:49:55 +00:00
return Scaffold(
appBar: AppBar(
2024-11-06 01:54:08 +00:00
title: Text('Kontrol', style: AppTheme.labelMedium),
2024-10-01 03:49:55 +00:00
centerTitle: true,
backgroundColor: Colors.white,
scrolledUnderElevation: 0,
),
body: RefreshIndicator(
2024-10-09 04:45:19 +00:00
displacement: 10,
onRefresh: () async =>
await context.read<ControlProvider>().getRelayStatus(),
child: SafeArea(
child: ListView(
children: [
2024-10-09 04:45:19 +00:00
Consumer<ControlProvider>(builder: (context, provider, child) {
switch (provider.relayState) {
case ResultState.loading:
return const StatusBarWidget(
text: 'Memuat...',
icon: BootstrapIcons.cloud,
2024-11-12 03:54:42 +00:00
color: Colors.grey,
2024-10-09 04:45:19 +00:00
isLoading: true,
);
case ResultState.hasData:
return const StatusBarWidget(
text: 'Berhasil terhubung',
icon: BootstrapIcons.check_circle,
color: Colors.teal,
);
case ResultState.noData:
return const StatusBarWidget(
text: 'Data tidak ditemukan',
icon: BootstrapIcons.exclamation_circle,
color: Colors.amber,
);
case ResultState.initial:
return const SizedBox.shrink();
case ResultState.error:
return const StatusBarWidget(
text: 'Tidak dapat terhubung',
icon: BootstrapIcons.exclamation_circle,
color: Colors.red,
);
}
}),
2024-11-12 03:54:42 +00:00
PumpStatusWidget(
title: 'Pompa Air',
subtitle: 'Relay 3',
isActive: provider.control_3,
onTap: () {},
),
SizedBox(height: 16.h),
GridView(
padding: EdgeInsets.all(16.r),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16.r,
mainAxisSpacing: 16.r,
childAspectRatio: 1.35.h,
),
children: [
ControlButtonWidget(
2024-10-24 07:09:30 +00:00
title: 'Katup Nutrisi',
subtitle: 'Relay 1',
isActive: provider.control_1,
onTap: () async {
2024-11-12 03:54:42 +00:00
await _changeRelayStateAction(
provider: provider,
relayOn: 1,
relayOff: 2,
);
},
2024-10-08 02:23:48 +00:00
),
ControlButtonWidget(
2024-10-24 07:09:30 +00:00
title: 'Katup Air',
subtitle: 'Relay 2',
isActive: provider.control_2,
2024-10-24 07:09:30 +00:00
onTap: () async {
2024-11-12 03:54:42 +00:00
await _changeRelayStateAction(
provider: provider,
relayOn: 2,
relayOff: 1,
);
},
),
],
),
2024-11-12 03:54:42 +00:00
SizedBox(height: 16.h),
Padding(
padding: EdgeInsets.fromLTRB(16.r, 0, 16.r, 16.h),
child: Row(
children: [
Icon(
BootstrapIcons.clock,
size: 20.r,
),
SizedBox(width: 8.w),
Text(
'Terakhir Diperbarui',
style: AppTheme.labelMedium,
),
],
),
),
Consumer<ControlProvider>(builder: (context, provider, child) {
return Column(
children: [
RelayStatusHistoryWidget(
name: 'Katup Nutrisi',
imageUrl: 'assets/images/valve.png',
enabledAt: provider.relay1.enabledAt,
disabledAt: provider.relay1.disabledAt,
),
RelayStatusHistoryWidget(
name: 'Katup Air',
imageUrl: 'assets/images/valve.png',
enabledAt: provider.relay2.enabledAt,
disabledAt: provider.relay2.disabledAt,
),
RelayStatusHistoryWidget(
name: 'Pompa Air',
imageUrl: 'assets/images/water_pump.png',
enabledAt: provider.relay3.enabledAt,
disabledAt: provider.relay3.disabledAt,
),
],
);
}),
],
),
),
),
);
}
2024-11-12 03:54:42 +00:00
Future<void> _changeRelayStateAction({
required ControlProvider provider,
required int relayOn,
required int relayOff,
}) async {
if (relayOn == 1) {
// Aktifkan relay 1 dan relay 3, matikan relay 2
if (provider.control_1 == false) {
await provider.switchRelay(relayOff, false); // Matikan relay 2
await provider.switchRelay(3, true); // Aktifkan relay 3
await provider.switchRelay(relayOn, true); // Aktifkan relay 1
provider.switchControl(true, relayNumber: 1);
provider.switchControl(true, relayNumber: 3);
provider.switchControl(false, relayNumber: 2);
} else {
// Matikan semua relay jika relay 1 dimatikan
await provider.switchRelay(3, false);
await provider.switchRelay(relayOn, false);
provider.switchControl(false, relayNumber: 1);
provider.switchControl(false, relayNumber: 3);
}
} else if (relayOn == 2) {
// Aktifkan relay 2 dan relay 3, matikan relay 1
if (provider.control_2 == false) {
await provider.switchRelay(relayOff, false); // Matikan relay 1
await provider.switchRelay(3, true); // Aktifkan relay 3
await provider.switchRelay(relayOn, true); // Aktifkan relay 2
provider.switchControl(true, relayNumber: 2);
provider.switchControl(true, relayNumber: 3);
provider.switchControl(false, relayNumber: 1);
} else {
// Matikan semua relay jika relay 2 dimatikan
await provider.switchRelay(3, false);
await provider.switchRelay(relayOn, false);
provider.switchControl(false, relayNumber: 2);
provider.switchControl(false, relayNumber: 3);
}
}
}
}
2024-10-09 04:45:19 +00:00
class StatusBarWidget extends StatelessWidget {
const StatusBarWidget({
super.key,
2024-10-09 04:45:19 +00:00
required this.text,
required this.icon,
required this.color,
this.isLoading = false,
});
2024-10-09 04:45:19 +00:00
final String text;
final IconData icon;
final Color color;
final bool isLoading;
@override
Widget build(BuildContext context) {
return Container(
2024-10-09 04:45:19 +00:00
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 16.w),
margin: EdgeInsets.all(16.r),
decoration: BoxDecoration(
2024-10-09 04:45:19 +00:00
color: color.withAlpha(50),
borderRadius: BorderRadius.circular(8.r),
),
2024-10-09 04:45:19 +00:00
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
2024-10-09 04:45:19 +00:00
Icon(
icon,
color: color,
size: 16.r,
),
SizedBox(width: 8.w),
Text(text, style: AppTheme.titleSmall.copyWith(color: color)),
const Spacer(),
2024-10-09 04:45:19 +00:00
if (isLoading)
Center(
child: CupertinoActivityIndicator(
radius: 8.r,
))
else
const SizedBox.shrink(),
],
2024-10-08 02:23:48 +00:00
),
2024-10-01 03:49:55 +00:00
);
}
}