Skip to content

Commit

Permalink
Feature/cross communication (#57)
Browse files Browse the repository at this point in the history
* Improved message broadcast code

* Initial work

* Fixed heart beat animation and sound

* Fixed animation and sound weirdness when changing settings

* Fixed even more dumb things with the heart beat sound

* Did some view refactoring to make it less dumb

* Fixed text color property not working for heart rate widget

* Start/stop the server on lifecycle events

* Don't allow adding widget with empty data source

* Added setting for client name

* Added server ip editor to settings page

* Actually save client name

* Added code to connect to servers

* Improved socket connection code

* Close server connections on server stop

* Different way of telling if server connections close

* Sending data to other servers works

* Fixed widget selector not showing data
  • Loading branch information
Rexios80 authored May 3, 2021
1 parent 4946170 commit 878c7f8
Show file tree
Hide file tree
Showing 27 changed files with 616 additions and 305 deletions.
3 changes: 2 additions & 1 deletion lib/controllers/data_widget_controller.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import 'package:get/get.dart';
import 'package:hds_overlay/hive/data_type.dart';
import 'package:hds_overlay/hive/data_widget_properties.dart';
import 'package:tuple/tuple.dart';

class DataWidgetController extends GetxController {
final RxMap<DataType, Rx<DataWidgetProperties>> propertiesMap;
final RxMap<Tuple2<DataType, String>, Rx<DataWidgetProperties>> propertiesMap;

DataWidgetController(this.propertiesMap);
}
5 changes: 4 additions & 1 deletion lib/controllers/end_drawer_controller.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import 'package:get/get.dart';
import 'package:hds_overlay/hive/data_type.dart';
import 'package:hds_overlay/model/data_source.dart';
import 'package:tuple/tuple.dart';

class EndDrawerController extends GetxController {
RxBool open = false.obs;
Rx<DataType> selectedDataType = DataType.unknown.obs;
Rx<Tuple2<DataType, String>> selectedDataTypeSource =
Tuple2(DataType.unknown, DataSource.watch).obs;
}
3 changes: 1 addition & 2 deletions lib/controllers/heart_rate_widget_controller.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:get/get.dart';

class HeartRateWidgetController {
bool animating = false;
bool sounding = false;
int currentHeartRate = 0;
bool visible = true;
}
39 changes: 21 additions & 18 deletions lib/controllers/socket_server_controller.dart
Original file line number Diff line number Diff line change
@@ -1,34 +1,20 @@
import 'package:get/get.dart';
import 'package:hds_overlay/controllers/settings_controller.dart';
import 'package:hds_overlay/hive/data_type.dart';
import 'package:hds_overlay/hive/settings.dart';
import 'package:hds_overlay/model/log_message.dart';
import 'package:hds_overlay/model/message.dart';
import 'package:hds_overlay/services/socket_server.dart';
import 'package:tuple/tuple.dart';

class SocketServerController extends GetxService {
final SettingsController settingsController = Get.find();
final server = SocketServer();
final messages = Map<DataType, DataMessage>().obs;
final messages = Map<Tuple2<DataType, String>, DataMessage>().obs;
final logs = <LogMessage>[].obs;

late int port;

SocketServerController() {
this.port = settingsController.settings.value.port;
server.start(port);

// Restart the server if the port changes
debounce(settingsController.settings, (Settings settings) async {
if (port != settings.port) {
port = settings.port;
await server.stop();
server.start(port);
}
});

server.messageStream.listen((message) {
final log = '(${message.source.name}) ${message.name}: ${message.value}';
final log = '(${message.source}) ${message.name}: ${message.value}';

if (message is UnknownDataMessage) {
// Don't do anything with these
Expand All @@ -37,7 +23,7 @@ class SocketServerController extends GetxService {
}

message as DataMessage;
messages[message.dataType] = message;
messages[Tuple2(message.dataType, message.source)] = message;
logs.add(LogMessage(LogLevel.data, log));
});

Expand All @@ -46,4 +32,21 @@ class SocketServerController extends GetxService {
logs.add(log);
});
}

void stopServer() {
server.stop();
}

void startServer() {
// If the log is modified here the view will be in a bad state
Future.delayed(
Duration(milliseconds: 500),
() => logs.add(LogMessage(LogLevel.info,
'Client name: ${settingsController.settings.value.clientName}')));
server.start(
settingsController.settings.value.port,
settingsController.settings.value.clientName,
settingsController.settings.value.serverIps,
);
}
}
6 changes: 6 additions & 0 deletions lib/controllers/widget_selector_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import 'package:get/get.dart';
import 'package:hds_overlay/model/data_source.dart';

class WidgetSelectorController extends GetxController {
RxString dataSource = DataSource.watch.obs;
}
10 changes: 10 additions & 0 deletions lib/hive/data_widget_properties.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:hds_overlay/hive/tuple2_double.dart';
import 'package:hds_overlay/model/data_source.dart';
import 'package:hive/hive.dart';

import 'data_type.dart';
Expand Down Expand Up @@ -81,4 +82,13 @@ class DataWidgetProperties extends HiveObject {
set textInsideImage(bool value) {
_textInsideImage = value;
}

@HiveField(22)
String? _dataSource;

String get dataSource => _dataSource ?? DataSource.watch;

set dataSource(String value) {
_dataSource = value;
}
}
9 changes: 6 additions & 3 deletions lib/hive/data_widget_properties.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions lib/hive/hive_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:hds_overlay/hive/settings.dart';
import 'package:hds_overlay/hive/tuple2_double.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:tuple/tuple.dart';

import 'data_type.dart';

Expand Down Expand Up @@ -66,10 +67,10 @@ class HiveUtils {
return Future.value();
}

static Map<DataType, Rx<DataWidgetProperties>> createDwpMap(
static Map<Tuple2<DataType, String>, Rx<DataWidgetProperties>> createDwpMap(
Box<DataWidgetProperties> dwpBox) {
final map = Map<DataType, Rx<DataWidgetProperties>>();
dwpBox.values.forEach((e) => map[e.dataType] = e.obs);
final map = Map<Tuple2<DataType, String>, Rx<DataWidgetProperties>>();
dwpBox.values.forEach((e) => map[Tuple2(e.dataType, e.dataSource)] = e.obs);
return map;
}
}
19 changes: 19 additions & 0 deletions lib/hive/settings.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:hds_overlay/utils/colors.dart';
import 'package:hive/hive.dart';
import 'package:uuid/uuid.dart';

part 'settings.g.dart';

Expand Down Expand Up @@ -40,4 +41,22 @@ class Settings extends HiveObject {
set overlayHeight(double value) {
_overlayHeight = value;
}

@HiveField(5)
String? _clientName;

String get clientName => _clientName ?? 'HDS-${Uuid().v4()}';

set clientName(String value) {
_clientName = value;
}

@HiveField(6)
List<String>? _serverIps;

List<String> get serverIps => _serverIps ?? [];

set serverIps(List<String> value) {
_serverIps = value;
}
}
12 changes: 9 additions & 3 deletions lib/hive/settings.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:hds_overlay/utils/themes.dart';
import 'package:hds_overlay/view/routes.dart';
import 'package:hds_overlay/view/screens/settings_view.dart';
import 'package:hds_overlay/view/widgets/overlay.dart';
import 'package:lifecycle/lifecycle.dart';
import 'package:provider/provider.dart';

import 'controllers/settings_controller.dart';
Expand All @@ -26,6 +27,7 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetMaterialApp(
navigatorObservers: [defaultLifecycleObserver],
title: 'Health Data Server',
theme: Themes.light,
darkTheme: Themes.dark,
Expand Down
8 changes: 2 additions & 6 deletions lib/model/data_source.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
class DataSource {
static final watch = DataSource('watch');
static final unknown = DataSource('unknown');

final String name;

DataSource(this.name);
static final watch = 'watch';
static final unknown = 'unknown';
}
8 changes: 3 additions & 5 deletions lib/model/message.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:enum_to_string/enum_to_string.dart';
import 'package:hds_overlay/hive/data_type.dart';

import 'data_source.dart';

// This might get annoying
extension DataTypeExtension on DataType {
static DataType fromString(String string) {
Expand All @@ -22,7 +20,7 @@ abstract class MessageBase {
}

abstract class DataMessageBase extends MessageBase {
final DataSource source;
final String source;
final dynamic value;

String get name;
Expand All @@ -37,7 +35,7 @@ class DataMessage extends DataMessageBase {
return EnumToString.convertToString(dataType);
}

DataMessage(DataSource source, this.dataType, dynamic value)
DataMessage(String source, this.dataType, dynamic value)
: super(source, value);
}

Expand All @@ -48,6 +46,6 @@ class UnknownDataMessage extends DataMessageBase {
return 'Unknown data type $_name';
}

UnknownDataMessage(DataSource source, this._name, dynamic value)
UnknownDataMessage(String source, this._name, dynamic value)
: super(source, value);
}
Empty file.
Loading

0 comments on commit 878c7f8

Please sign in to comment.