@@ -10,7 +10,6 @@ import 'package:flutter/foundation.dart';
1010import 'package:flutter/material.dart' ;
1111import 'package:flutter_android_volume_keydown/flutter_android_volume_keydown.dart' ;
1212import 'package:flutter_blue_plus/flutter_blue_plus.dart' hide CharacteristicProperties;
13- import 'package:flutter_riverpod/flutter_riverpod.dart' ;
1413import 'package:freezed_annotation/freezed_annotation.dart' ;
1514import 'package:hive_ce/hive.dart' ;
1615import 'package:intl/intl.dart' ;
@@ -422,6 +421,174 @@ class CoverTriggerDefinition extends TriggerDefinition {
422421 }
423422}
424423
424+ class ClawTiltTriggerDefinition extends TriggerDefinition {
425+ List <StreamSubscription <String >?> rxSubscriptions = [];
426+
427+ ClawTiltTriggerDefinition (super .ref) {
428+ super .name = triggerClawTiltModeTitle;
429+ super .description = triggerClawTiltModeDescription;
430+ super .icon = const Icon (Icons .threed_rotation);
431+ super .requiredPermission = null ;
432+ super .uuid = "664bd073-34cd-4c78-a7da-2b8b44fd9661" ;
433+ super .actionTypes = [
434+ TriggerActionDef (name: "Extend" , translated: triggerClawTiltModeExtend, uuid: "74728806-c72d-4b52-94c7-f475e80b826b" ),
435+ TriggerActionDef (name: "Retract" , translated: triggerClawTiltModeRetract, uuid: "ca2149c2-86d2-46d7-89b9-508bfab7a29cb" ),
436+ ];
437+ }
438+
439+ @override
440+ Future <bool > isSupported () async {
441+ return ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).isNotEmpty;
442+ }
443+
444+ @override
445+ Future <void > onDisable () async {
446+ KnownDevices .instance.removeListener (onDeviceConnected);
447+ ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
448+ element.deviceConnectionState.removeListener (onDeviceConnected);
449+ });
450+ for (var element in rxSubscriptions) {
451+ element? .cancel ();
452+ }
453+ rxSubscriptions = [];
454+ ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
455+ ref
456+ .read (commandQueueProvider (element).notifier)
457+ .addCommand (BluetoothMessage (message: "STOPTILT" , priority: Priority .low, responseMSG: "OK" , type: CommandType .system, timestamp: DateTime .now ()));
458+ });
459+ }
460+
461+ @override
462+ Future <void > onEnable () async {
463+ if (rxSubscriptions.isNotEmpty) {
464+ return ;
465+ }
466+ ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
467+ ref
468+ .read (commandQueueProvider (element).notifier)
469+ .addCommand (BluetoothMessage (message: "TILTMODE" , responseMSG: "OK" , priority: Priority .low, type: CommandType .system, timestamp: DateTime .now ()));
470+ });
471+ // Disable clap trigger when this one enables
472+ ref.read (triggerListProvider).where ((element) => element.triggerDefUUID == "50d65674-ed4f-4bf5-abd1-e5161faf2a5e" ).forEach ((element) => element.enabled = false );
473+ //add listeners on new device paired
474+ KnownDevices .instance.addListener (onDeviceConnected);
475+ }
476+
477+ Future <void > onDeviceConnected () async {
478+ ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).map ((e) {
479+ e.deviceConnectionState.removeListener (onDeviceConnected);
480+ e.deviceConnectionState.addListener (onDeviceConnected);
481+ });
482+ listen ();
483+ }
484+
485+ Future <void > listen () async {
486+ //cancel old subscriptions
487+ if (rxSubscriptions.isNotEmpty) {
488+ for (var element in rxSubscriptions) {
489+ element? .cancel ();
490+ }
491+ }
492+ //Store the current streams to keep them open
493+ rxSubscriptions = ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).map ((element) {
494+ ref
495+ .read (commandQueueProvider (element).notifier)
496+ .addCommand (BluetoothMessage (message: "TILTMODE" , responseMSG: "OK" , priority: Priority .low, type: CommandType .system, timestamp: DateTime .now ()));
497+ //TODO: Wire up with the real commands
498+ return element.rxCharacteristicStream.listen ((msg) {
499+ if (msg.contains ("TILT UP" )) {
500+ sendCommands ("Extend" , ref);
501+ }
502+ if (msg.contains ("TILT DOWN" )) {
503+ sendCommands ("Retract" , ref);
504+ }
505+ });
506+ }).toList ();
507+ }
508+ }
509+
510+ class ClawClapTriggerDefinition extends TriggerDefinition {
511+ List <StreamSubscription <String >?> rxSubscriptions = [];
512+
513+ ClawClapTriggerDefinition (super .ref) {
514+ super .name = triggerClawClapModeTitle;
515+ super .description = triggerClawClapModeDescription;
516+ super .icon = const Icon (Icons .waving_hand_sharp);
517+ super .requiredPermission = null ;
518+ super .uuid = "50d65674-ed4f-4bf5-abd1-e5161faf2a5e" ;
519+ super .actionTypes = [TriggerActionDef (name: "Clap" , translated: triggerClawClapMode, uuid: "6b88bc2a-dea2-435c-88be-7c16df687225" )];
520+ }
521+
522+ @override
523+ Future <bool > isSupported () async {
524+ return ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).isNotEmpty;
525+ }
526+
527+ @override
528+ Future <void > onDisable () async {
529+ KnownDevices .instance.removeListener (onDeviceConnected);
530+ ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
531+ element.deviceConnectionState.removeListener (onDeviceConnected);
532+ });
533+ for (var element in rxSubscriptions) {
534+ element? .cancel ();
535+ }
536+ rxSubscriptions = [];
537+ ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
538+ ref
539+ .read (commandQueueProvider (element).notifier)
540+ .addCommand (BluetoothMessage (message: "STOPCLAP" , priority: Priority .low, responseMSG: "OK" , type: CommandType .system, timestamp: DateTime .now ()));
541+ });
542+ }
543+
544+ @override
545+ Future <void > onEnable () async {
546+ if (rxSubscriptions.isNotEmpty) {
547+ return ;
548+ }
549+ ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).forEach ((element) {
550+ ref
551+ .read (commandQueueProvider (element).notifier)
552+ .addCommand (BluetoothMessage (message: "CLAPMODE" , responseMSG: "OK" , priority: Priority .low, type: CommandType .system, timestamp: DateTime .now ()));
553+ });
554+
555+ // Disable claw tilt trigger when this one enables
556+ ref.read (triggerListProvider).where ((element) => element.triggerDefUUID == "664bd073-34cd-4c78-a7da-2b8b44fd9661" ).forEach ((element) => element.enabled = false );
557+
558+ //add listeners on new device paired
559+ KnownDevices .instance.addListener (onDeviceConnected);
560+ }
561+
562+ Future <void > onDeviceConnected () async {
563+ ref.read (getKnownGearForTypeProvider (BuiltSet ([DeviceType .claws]))).map ((e) {
564+ e.deviceConnectionState.removeListener (onDeviceConnected);
565+ e.deviceConnectionState.addListener (onDeviceConnected);
566+ });
567+ listen ();
568+ }
569+
570+ Future <void > listen () async {
571+ //cancel old subscriptions
572+ if (rxSubscriptions.isNotEmpty) {
573+ for (var element in rxSubscriptions) {
574+ element? .cancel ();
575+ }
576+ }
577+ //Store the current streams to keep them open
578+ rxSubscriptions = ref.read (getAvailableGearForTypeProvider (BuiltSet ([DeviceType .claws]))).map ((element) {
579+ ref
580+ .read (commandQueueProvider (element).notifier)
581+ .addCommand (BluetoothMessage (message: "CLAPMODE" , responseMSG: "OK" , priority: Priority .low, type: CommandType .system, timestamp: DateTime .now ()));
582+ return element.rxCharacteristicStream.listen ((msg) {
583+ if (msg.contains ("DOUBLE CLAP" )) {
584+ // we don't store the actions in class as multiple Triggers can exist, so go get them. This is only necessary when the action is dependent on gear being available
585+ sendCommands ("Clap" , ref);
586+ }
587+ });
588+ }).toList ();
589+ }
590+ }
591+
425592class EarMicTriggerDefinition extends TriggerDefinition {
426593 List <StreamSubscription <String >?> rxSubscriptions = [];
427594
@@ -888,6 +1055,8 @@ class TriggerDefinitionList extends _$TriggerDefinitionList {
8881055 EarTiltTriggerDefinition (ref),
8891056 RandomTriggerDefinition (ref),
8901057 VolumeButtonTriggerDefinition (ref),
1058+ ClawClapTriggerDefinition (ref),
1059+ ClawTiltTriggerDefinition (ref),
8911060 ];
8921061
8931062 triggerDefinitions.sort ();
0 commit comments