diff --git a/lib/main.dart b/lib/main.dart index 82dc463..bad9274 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,8 +8,8 @@ void main() { } class MyApp extends StatelessWidget { - MyApp({super.key}){ - NTUtils().connect("10.5.78.2"); + MyApp({super.key}) { + NTUtils().connect("localhost"); } // This widget is the root of your application. @@ -33,7 +33,10 @@ class MyApp extends StatelessWidget { // // This works for code too, not just values: Most code changes can be // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue, brightness: Brightness.dark), + colorScheme: ColorScheme.fromSeed( + seedColor: Colors.blue, + brightness: Brightness.dark, + ), ), home: const Dashboard(), ); diff --git a/lib/ntutils.dart b/lib/ntutils.dart index c6c02ca..e18b2e7 100644 --- a/lib/ntutils.dart +++ b/lib/ntutils.dart @@ -1,7 +1,8 @@ +import "dart:ui"; + import "package:nt4/nt4.dart"; -class NTUtils{ - +class NTUtils { static final NTUtils _instance = NTUtils._internal(); factory NTUtils() { @@ -12,41 +13,71 @@ class NTUtils{ bool _isAttemptingToConnect = false; String _serverAddress = ""; - NT4Client? ntClient; + NT4Client? ntClient; final Map _nt4Subscriptions = {}; - void connect(String serverAddress){ - _serverAddress = serverAddress; - _isAttemptingToConnect = true; - ntClient = NT4Client(serverBaseAddress: serverAddress, onConnect: () { isConnected = true; _isAttemptingToConnect = false; }, onDisconnect: () { isConnected = false; }); + final List connectCallbacks = []; + final List disconnectCallbacks = []; + + void addConnectCallback(VoidCallback cb) { + connectCallbacks.add(cb); } - String connectionStatus(){ - if(_isAttemptingToConnect){ + void addDisconnectCallback(VoidCallback cb) { + disconnectCallbacks.add(cb); + } + + void connect(String serverAddress) { + _serverAddress = serverAddress; + _isAttemptingToConnect = true; + ntClient = NT4Client( + serverBaseAddress: serverAddress, + onConnect: () { + isConnected = true; + _isAttemptingToConnect = false; + + for (VoidCallback cb in connectCallbacks) { + cb(); + } + }, + onDisconnect: () { + isConnected = false; + + for (VoidCallback cb in disconnectCallbacks) { + cb(); + } + }, + ); + } + + String connectionStatus() { + if (_isAttemptingToConnect) { return "Attempting to connect to $_serverAddress"; } - if(isConnected){ + if (isConnected) { return "Connected"; - }else{ + } else { return "Not Connected"; } } - - NT4Subscription subscribe(String topic){ - if (!_nt4Subscriptions.containsKey(topic)) - { - NT4Subscription subscrip = ntClient!.subscribe(topic, NT4SubscriptionOptions()); + + NT4Subscription subscribe(String topic) { + if (!_nt4Subscriptions.containsKey(topic)) { + NT4Subscription subscrip = ntClient!.subscribe( + topic, + NT4SubscriptionOptions(), + ); _nt4Subscriptions[topic] = subscrip; } - + return _nt4Subscriptions[topic]!; } - + final Map _nt4Topics = {}; - NT4Topic getPublicTopic(String topic, String type){ - if(!_nt4Topics.containsKey(topic)){ + NT4Topic getPublicTopic(String topic, String type) { + if (!_nt4Topics.containsKey(topic)) { NT4Topic top = ntClient!.publishNewTopic(topic, type); _nt4Topics[topic] = top; } @@ -56,4 +87,3 @@ class NTUtils{ NTUtils._internal(); } - diff --git a/lib/pages/dashboard.dart b/lib/pages/dashboard.dart index d821891..055ee00 100644 --- a/lib/pages/dashboard.dart +++ b/lib/pages/dashboard.dart @@ -1,12 +1,31 @@ import 'package:flutter/material.dart'; import 'package:helm/ntutils.dart'; import 'package:helm/widgets/base_card.dart'; +import 'package:helm/widgets/posty_results_card.dart'; import 'package:responsive_grid/responsive_grid.dart'; import '../widgets/text_card.dart'; -class Dashboard extends StatelessWidget { +class Dashboard extends StatefulWidget { const Dashboard({super.key}); + @override + State createState() => _DashboardState(); +} + +class _DashboardState extends State { + String connectionState = NTUtils().connectionStatus(); + + _DashboardState() { + NTUtils().addConnectCallback(updateConnectionState); + NTUtils().addDisconnectCallback(updateConnectionState); + } + + void updateConnectionState() { + setState(() { + connectionState = NTUtils().connectionStatus(); + }); + } + @override Widget build(BuildContext context) { // This method is rerun every time setState is called, for instance as done @@ -23,7 +42,7 @@ class Dashboard extends StatelessWidget { backgroundColor: Theme.of(context).colorScheme.inversePrimary, // Here we take the value from the MyHomePage object that was created by // the App.build method, and use it to set our appbar title. - title: Text("Helm - ${NTUtils().connectionStatus()}"), + title: Text("Helm - $connectionState"), ), body: ResponsiveGridRow( children: [ @@ -41,7 +60,10 @@ class Dashboard extends StatelessWidget { children: [ ResponsiveGridCol( md: 6, - child: TextCard(cardTitle: "Match State"), + child: TextCard( + cardTitle: "Match State", + ntTopic: "/FMSInfo/StationNumber", + ), ), ResponsiveGridCol( md: 6, @@ -49,7 +71,7 @@ class Dashboard extends StatelessWidget { ), ResponsiveGridCol( md: 6, - child: TextCard(cardTitle: "Blah Blah"), + child: TextCard(cardTitle: "Robot State"), ), ], ), diff --git a/lib/widgets/text_card.dart b/lib/widgets/text_card.dart index 4dc15eb..bc1651f 100644 --- a/lib/widgets/text_card.dart +++ b/lib/widgets/text_card.dart @@ -24,25 +24,22 @@ class TextCard extends StatefulWidget { class _TextCardState extends State { String _val = ""; - void setVal( String newVal ) - { - _val = newVal; + void setVal(String newVal) { + setState(() { + _val = newVal; + }); } @override Widget build(BuildContext context) { - if(NTUtils().isConnected){ - NT4Subscription sub = NTUtils().subscribe(widget.ntTopic!); - sub.listen( (data) => setVal(data.toString()) ); - } + NT4Subscription sub = NTUtils().subscribe(widget.ntTopic!); + sub.listen((data) => setVal(data.toString())); return BaseCard( cardTitle: widget.cardTitle, width: widget.width, height: widget.height, - children: [ - Text(_val) - ], + children: [Text(_val)], ); } }