can_bus_toolkit 0.1.0
can_bus_toolkit: ^0.1.0 copied to clipboard
CAN bus toolkit for Android over USB OTG: PCAN-USB and SLCAN adapters, candump logging, ISO-TP, OBD-II and UDS clients, and DBC signal decoding.
import 'package:flutter/material.dart';
import 'app/app_state.dart';
import 'app/saved_commands.dart';
import 'screens/dbc_screen.dart';
import 'screens/devices_screen.dart';
import 'screens/logs_screen.dart';
import 'screens/monitor_screen.dart';
import 'screens/obd_screen.dart';
import 'screens/send_screen.dart';
import 'screens/stats_screen.dart';
import 'screens/widgets.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final state = AppState(await Settings.load());
runApp(CanBusToolkitExampleApp(state: state));
await state.init();
}
/// Demo app for can_bus_toolkit.
class CanBusToolkitExampleApp extends StatelessWidget {
/// Creates the app around [state].
const CanBusToolkitExampleApp({super.key, required this.state});
/// Shared app state.
final AppState state;
@override
Widget build(BuildContext context) {
return AppScope(
state: state,
child: MaterialApp(
title: 'CAN Bus Toolkit',
theme: ThemeData(colorSchemeSeed: Colors.indigo, useMaterial3: true),
darkTheme: ThemeData(
colorSchemeSeed: Colors.indigo,
brightness: Brightness.dark,
useMaterial3: true,
),
home: const HomeScreen(),
),
);
}
}
class _Destination {
const _Destination(this.label, this.icon, this.builder);
final String label;
final IconData icon;
final Widget Function() builder;
}
/// Drawer navigation over all screens; each keeps its state.
class HomeScreen extends StatefulWidget {
/// Creates the home screen.
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
static final _destinations = [
_Destination('Devices', Icons.usb, DevicesScreen.new),
_Destination('Monitor', Icons.list_alt, MonitorScreen.new),
_Destination('Send', Icons.send, SendScreen.new),
_Destination('Statistics', Icons.speed, StatsScreen.new),
_Destination('Logs', Icons.save_alt, LogsScreen.new),
_Destination('OBD-II', Icons.directions_car, ObdScreen.new),
_Destination('DBC', Icons.table_chart, DbcScreen.new),
];
int _index = 0;
late final List<Widget> _pages = [for (final d in _destinations) d.builder()];
@override
Widget build(BuildContext context) {
final state = AppScope.of(context);
return Scaffold(
appBar: AppBar(
title: Text(_destinations[_index].label),
actions: [
ListenableBuilder(
listenable: state,
builder: (context, _) => Padding(
padding: const EdgeInsets.only(right: 12),
child: BusStatusChip(state: state),
),
),
],
),
drawer: NavigationDrawer(
selectedIndex: _index,
onDestinationSelected: (i) {
setState(() => _index = i);
Navigator.of(context).pop();
},
children: [
const Padding(
padding: EdgeInsets.fromLTRB(28, 16, 16, 10),
child: Text(
'CAN Bus Toolkit',
style: TextStyle(fontWeight: FontWeight.w600),
),
),
for (final d in _destinations)
NavigationDrawerDestination(
icon: Icon(d.icon),
label: Text(d.label),
),
],
),
body: SafeArea(
child: IndexedStack(index: _index, children: _pages),
),
);
}
}