2022-06-22 09:05:56 -07:00
//
// E x t e r n a l N o t i f i c a t i o n C o n f i g . s w i f t
// M e s h t a s t i c A p p l e
//
// C o p y r i g h t ( c ) G a r t h V a n d e r H o u w e n 6 / 2 2 / 2 2 .
//
import SwiftUI
2022-06-29 20:04:20 -07:00
enum OutputIntervals : Int , CaseIterable , Identifiable {
2022-12-23 11:30:55 -08:00
2022-12-23 10:03:43 -08:00
case unset = 0
2022-09-10 18:27:44 -07:00
case oneSecond = 1000
2022-06-29 20:04:20 -07:00
case twoSeconds = 2000
case threeSeconds = 3000
case fourSeconds = 4000
case fiveSeconds = 5000
case tenSeconds = 10000
case fifteenSeconds = 15000
case thirtySeconds = 30000
case oneMinute = 60000
2022-12-23 11:30:55 -08:00
2022-06-29 20:04:20 -07:00
var id : Int { self . rawValue }
var description : String {
get {
switch self {
2022-12-23 11:30:55 -08:00
2022-12-23 10:03:43 -08:00
case . unset :
return " Unset "
2022-06-29 20:04:20 -07:00
case . oneSecond :
return " One Second "
case . twoSeconds :
return " Two Seconds "
case . threeSeconds :
return " Three Seconds "
case . fourSeconds :
return " Four Seconds "
case . fiveSeconds :
return " Five Seconds "
case . tenSeconds :
return " Ten Seconds "
case . fifteenSeconds :
return " Fifteen Seconds "
case . thirtySeconds :
return " Thirty Seconds "
case . oneMinute :
return " One Minute "
}
}
}
}
2022-06-22 09:05:56 -07:00
struct ExternalNotificationConfig : View {
@ Environment ( \ . managedObjectContext ) var context
@ EnvironmentObject var bleManager : BLEManager
2022-12-09 18:19:00 -08:00
@ Environment ( \ . dismiss ) private var goBack
2022-06-22 09:05:56 -07:00
2022-07-07 00:29:52 -07:00
var node : NodeInfoEntity ?
2022-06-22 09:05:56 -07:00
2022-07-01 10:57:54 -07:00
@ State private var isPresentingSaveConfirm : Bool = false
@ State var hasChanges = false
2022-06-22 09:05:56 -07:00
@ State var enabled = false
@ State var alertBell = false
2022-12-23 11:30:55 -08:00
@ State var alertBellBuzzer = false
@ State var alertBellVibra = false
2022-07-01 10:57:54 -07:00
@ State var alertMessage = false
2022-12-23 11:30:55 -08:00
@ State var alertMessageBuzzer = false
@ State var alertMessageVibra = false
2022-07-01 10:57:54 -07:00
@ State var active = false
2022-12-23 14:00:48 -08:00
@ State var usePWM = false
2022-07-01 10:57:54 -07:00
@ State var output = 0
2022-12-23 11:30:55 -08:00
@ State var outputBuzzer = 0
@ State var outputVibra = 0
2022-07-01 10:57:54 -07:00
@ State var outputMilliseconds = 0
2022-12-23 11:30:55 -08:00
@ State var nagTimeout = 0
2022-06-22 09:05:56 -07:00
var body : some View {
2022-12-23 14:00:48 -08:00
2022-12-23 11:30:55 -08:00
Form {
Section ( header : Text ( " options " ) ) {
Toggle ( isOn : $ enabled ) {
Label ( " enabled " , systemImage : " megaphone " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Toggle ( isOn : $ alertBell ) {
Label ( " Alert when receiving a bell " , systemImage : " bell " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Toggle ( isOn : $ alertMessage ) {
Label ( " Alert when receiving a message " , systemImage : " message " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Toggle ( isOn : $ usePWM ) {
Label ( " Use PWM Buzzer " , systemImage : " light.beacon.max.fill " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
2022-12-23 14:00:48 -08:00
Text ( " Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead. " )
2022-12-23 11:30:55 -08:00
. font ( . caption )
}
if ! usePWM {
Section ( header : Text ( " Primary GPIO " ) ) {
Toggle ( isOn : $ active ) {
Label ( " Active " , systemImage : " togglepower " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Text ( " If enabled, the 'output' Pin will be pulled active high, disabled means active low. " )
. font ( . caption )
Picker ( " Output pin GPIO " , selection : $ output ) {
ForEach ( 0. . < 40 ) {
if $0 = = 0 {
Text ( " Unset " )
} else {
Text ( " Pin \( $0 ) " )
}
}
}
. pickerStyle ( DefaultPickerStyle ( ) )
Picker ( " GPIO Output Duration " , selection : $ outputMilliseconds ) {
ForEach ( OutputIntervals . allCases ) { oi in
Text ( oi . description )
}
}
. pickerStyle ( DefaultPickerStyle ( ) )
Text ( " When using in GPIO mode, keep the output on for this long. " )
. font ( . caption )
2022-12-23 14:00:48 -08:00
Picker ( " Nag timeout " , selection : $ nagTimeout ) {
ForEach ( OutputIntervals . allCases ) { oi in
Text ( oi . description )
}
}
. pickerStyle ( DefaultPickerStyle ( ) )
Text ( " Specifies how long the monitored GPIO should output. " )
. font ( . caption )
2022-12-23 11:30:55 -08:00
}
Section ( header : Text ( " Optional GPIO " ) ) {
Toggle ( isOn : $ alertBellBuzzer ) {
Label ( " Alert GPIO buzzer when receiving a bell " , systemImage : " bell " )
2022-06-22 09:05:56 -07:00
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
2022-12-23 11:30:55 -08:00
Toggle ( isOn : $ alertBellVibra ) {
Label ( " Alert GPIO vibra motor when receiving a bell " , systemImage : " bell " )
2022-06-22 09:05:56 -07:00
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
2022-12-23 11:30:55 -08:00
Toggle ( isOn : $ alertMessageBuzzer ) {
2022-12-23 14:00:48 -08:00
Label ( " Alert GPIO buzzer when receiving a message " , systemImage : " message " )
2022-06-22 09:05:56 -07:00
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
2022-12-23 11:30:55 -08:00
Toggle ( isOn : $ alertMessageBuzzer ) {
Label ( " Alert GPIO vibra motor when receiving a message " , systemImage : " message " )
2022-06-22 09:05:56 -07:00
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
2022-12-23 11:30:55 -08:00
Picker ( " Output pin buzzer GPIO " , selection : $ outputBuzzer ) {
ForEach ( 0. . < 40 ) {
if $0 = = 0 {
Text ( " Unset " )
} else {
Text ( " Pin \( $0 ) " )
2022-06-22 15:52:51 -07:00
}
2022-06-22 09:05:56 -07:00
}
2022-12-23 11:30:55 -08:00
}
. pickerStyle ( DefaultPickerStyle ( ) )
Picker ( " Output pin vibra GPIO " , selection : $ outputVibra ) {
ForEach ( 0. . < 40 ) {
if $0 = = 0 {
Text ( " Unset " )
} else {
Text ( " Pin \( $0 ) " )
2022-11-29 21:24:20 -08:00
}
2022-06-29 20:04:20 -07:00
}
}
2022-12-23 11:30:55 -08:00
. pickerStyle ( DefaultPickerStyle ( ) )
2022-07-01 10:57:54 -07:00
}
}
2022-12-23 11:30:55 -08:00
}
. disabled ( bleManager . connectedPeripheral = = nil )
Button {
isPresentingSaveConfirm = true
} label : {
Label ( " save " , systemImage : " square.and.arrow.down " )
}
. disabled ( bleManager . connectedPeripheral = = nil || ! hasChanges )
. buttonStyle ( . bordered )
. buttonBorderShape ( . capsule )
. controlSize ( . large )
. padding ( )
. confirmationDialog (
" are.you.sure " ,
isPresented : $ isPresentingSaveConfirm ,
titleVisibility : . visible
) {
Button ( " Save External Notification Module Config to \( bleManager . connectedPeripheral != nil ? bleManager . connectedPeripheral . longName : " Unknown " ) ? " ) {
var enc = ModuleConfig . ExternalNotificationConfig ( )
enc . enabled = enabled
enc . alertBell = alertBell
enc . alertBellBuzzer = alertBellBuzzer
enc . alertBellVibra = alertBellVibra
enc . alertMessage = alertMessage
enc . alertMessageBuzzer = alertMessageBuzzer
enc . alertMessageVibra = alertMessageVibra
enc . active = active
enc . output = UInt32 ( output )
enc . outputBuzzer = UInt32 ( outputBuzzer )
enc . outputVibra = UInt32 ( outputVibra )
enc . outputMs = UInt32 ( outputMilliseconds )
enc . usePwm = usePWM
let adminMessageId = bleManager . saveExternalNotificationModuleConfig ( config : enc , fromUser : node ! . user ! , toUser : node ! . user ! )
if adminMessageId > 0 {
// S h o u l d s h o w a s a v e d s u c c e s s f u l l y a l e r t o n c e I k n o w t h a t t o b e t r u e
// f o r n o w j u s t d i s a b l e t h e b u t t o n a f t e r a s u c c e s s f u l s a v e
hasChanges = false
goBack ( )
2022-07-11 16:18:16 -07:00
}
2022-07-02 12:34:45 -07:00
}
2022-12-23 11:30:55 -08:00
}
. navigationTitle ( " external.notification.config " )
. navigationBarItems ( trailing :
ZStack {
ConnectedDevice ( bluetoothOn : bleManager . isSwitchedOn , deviceConnected : bleManager . connectedPeripheral != nil , name : ( bleManager . connectedPeripheral != nil ) ? bleManager . connectedPeripheral . shortName : " ???? " )
} )
. onAppear {
self . bleManager . context = context
self . enabled = node ? . externalNotificationConfig ? . enabled ? ? false
self . alertBell = node ? . externalNotificationConfig ? . alertBell ? ? false
self . alertBellBuzzer = node ? . externalNotificationConfig ? . alertBellBuzzer ? ? false
self . alertBellVibra = node ? . externalNotificationConfig ? . alertBellVibra ? ? false
self . alertMessage = node ? . externalNotificationConfig ? . alertMessage ? ? false
self . alertMessageBuzzer = node ? . externalNotificationConfig ? . alertMessageBuzzer ? ? false
self . alertMessageVibra = node ? . externalNotificationConfig ? . alertMessageVibra ? ? false
self . active = node ? . externalNotificationConfig ? . active ? ? false
self . output = Int ( node ? . externalNotificationConfig ? . output ? ? 0 )
self . outputBuzzer = Int ( node ? . externalNotificationConfig ? . outputBuzzer ? ? 0 )
self . outputVibra = Int ( node ? . externalNotificationConfig ? . outputVibra ? ? 0 )
self . outputMilliseconds = Int ( node ? . externalNotificationConfig ? . outputMilliseconds ? ? 0 )
self . nagTimeout = Int ( node ? . externalNotificationConfig ? . nagTimeout ? ? 0 )
2022-12-23 14:00:48 -08:00
self . usePWM = node ? . externalNotificationConfig ? . usePWM ? ? false
2022-12-23 11:30:55 -08:00
self . hasChanges = false
}
. onChange ( of : enabled ) { newEnabled in
if node != nil && node ! . externalNotificationConfig != nil {
if newEnabled != node ! . externalNotificationConfig ! . enabled { hasChanges = true }
2022-07-02 12:34:45 -07:00
}
2022-12-23 11:30:55 -08:00
}
. onChange ( of : alertBell ) { newAlertBell in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertBell != node ! . externalNotificationConfig ! . alertBell { hasChanges = true }
2022-07-02 12:34:45 -07:00
}
2022-12-23 11:30:55 -08:00
}
. onChange ( of : alertBellBuzzer ) { newAlertBellBuzzer in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertBellBuzzer != node ! . externalNotificationConfig ! . alertBellBuzzer { hasChanges = true }
2022-07-02 12:34:45 -07:00
}
2022-12-23 11:30:55 -08:00
}
. onChange ( of : alertBellVibra ) { newAlertBellVibra in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertBellVibra != node ! . externalNotificationConfig ! . alertBellVibra { hasChanges = true }
2022-07-02 12:34:45 -07:00
}
2022-12-23 11:30:55 -08:00
}
. onChange ( of : alertMessage ) { newAlertMessage in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertMessage != node ! . externalNotificationConfig ! . alertMessage { hasChanges = true }
2022-06-22 09:05:56 -07:00
}
2022-12-23 11:30:55 -08:00
}
. onChange ( of : alertMessageBuzzer ) { newAlertMessageBuzzer in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertMessageBuzzer != node ! . externalNotificationConfig ! . alertMessageBuzzer { hasChanges = true }
}
}
. onChange ( of : alertMessageVibra ) { newAlertMessageVibra in
if node != nil && node ! . externalNotificationConfig != nil {
if newAlertMessageVibra != node ! . externalNotificationConfig ! . alertMessageVibra { hasChanges = true }
}
}
. onChange ( of : active ) { newActive in
if node != nil && node ! . externalNotificationConfig != nil {
if newActive != node ! . externalNotificationConfig ! . active { hasChanges = true }
}
}
. onChange ( of : output ) { newOutput in
if node != nil && node ! . externalNotificationConfig != nil {
if newOutput != node ! . externalNotificationConfig ! . output { hasChanges = true }
}
}
. onChange ( of : output ) { newOutputBuzzer in
if node != nil && node ! . externalNotificationConfig != nil {
if newOutputBuzzer != node ! . externalNotificationConfig ! . outputBuzzer { hasChanges = true }
}
}
. onChange ( of : output ) { newOutputVibra in
if node != nil && node ! . externalNotificationConfig != nil {
if newOutputVibra != node ! . externalNotificationConfig ! . outputVibra { hasChanges = true }
}
}
. onChange ( of : outputMilliseconds ) { newOutputMs in
if node != nil && node ! . externalNotificationConfig != nil {
if newOutputMs != node ! . externalNotificationConfig ! . outputMilliseconds { hasChanges = true }
}
}
. onChange ( of : usePWM ) { newUsePWM in
if node != nil && node ! . externalNotificationConfig != nil {
if newUsePWM != node ! . externalNotificationConfig ! . usePWM { hasChanges = true }
}
}
. onChange ( of : nagTimeout ) { newNagTimeout in
if node != nil && node ! . externalNotificationConfig != nil {
if newNagTimeout != node ! . externalNotificationConfig ! . nagTimeout { hasChanges = true }
2022-11-29 21:24:20 -08:00
}
2022-06-22 09:05:56 -07:00
}
}
}