diff --git a/HeliPort.xcodeproj/project.pbxproj b/HeliPort.xcodeproj/project.pbxproj index 91d8e7e7..2220e37b 100644 --- a/HeliPort.xcodeproj/project.pbxproj +++ b/HeliPort.xcodeproj/project.pbxproj @@ -22,9 +22,11 @@ BCFA32ED2424D2BF00E23603 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BCFA32EC2424D2BF00E23603 /* Assets.xcassets */; }; BCFA32F02424D2BF00E23603 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCFA32EE2424D2BF00E23603 /* MainMenu.xib */; }; D47DD664F9B2939B57C54DF4 /* Pods_HeliPort.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEE10AB0115816EC5C117043 /* Pods_HeliPort.framework */; }; + F34B2B8D24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */; }; F379276F24A0A4A50087FF2B /* CredentialsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379276E24A0A4A50087FF2B /* CredentialsManager.swift */; }; F379277124A0A52E0087FF2B /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277024A0A52E0087FF2B /* Log.swift */; }; F379277424A0DADD0087FF2B /* WifiPopupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */; }; + F3915F0724AB1A1B00E6614D /* itl_80211_state+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */; }; F84E327924457FAE00D07895 /* ItlNetworkUserClient.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F84E327724457FAE00D07895 /* ItlNetworkUserClient.hpp */; }; F86A8960243CD13300CBABC2 /* TestService.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F86A895F243CD13300CBABC2 /* TestService.hpp */; }; F86A8962243CD13400CBABC2 /* TestService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F86A8961243CD13400CBABC2 /* TestService.cpp */; }; @@ -81,9 +83,11 @@ BCFA32F12424D2BF00E23603 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BCFA32F22424D2BF00E23603 /* HeliPort.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HeliPort.entitlements; sourceTree = ""; }; DEE10AB0115816EC5C117043 /* Pods_HeliPort.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HeliPort.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMenuItem+Extensions.swift"; sourceTree = ""; }; F379276E24A0A4A50087FF2B /* CredentialsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialsManager.swift; sourceTree = ""; }; F379277024A0A52E0087FF2B /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WifiPopupWindow.swift; sourceTree = ""; }; + F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "itl_80211_state+Status.swift"; sourceTree = ""; }; F84E327624457FAE00D07895 /* ItlNetworkUserClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ItlNetworkUserClient.cpp; sourceTree = ""; }; F84E327724457FAE00D07895 /* ItlNetworkUserClient.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ItlNetworkUserClient.hpp; sourceTree = ""; }; F86A895D243CD13000CBABC2 /* TestService.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestService.kext; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -196,11 +200,21 @@ BCFA32F22424D2BF00E23603 /* HeliPort.entitlements */, 7557CDF324935260000F0F71 /* Credits.rtf */, F379276E24A0A4A50087FF2B /* CredentialsManager.swift */, - F379277024A0A52E0087FF2B /* Log.swift */, + F34B2B8B24AA4C08009AB1BB /* Supporting files */, ); path = HeliPort; sourceTree = ""; }; + F34B2B8B24AA4C08009AB1BB /* Supporting files */ = { + isa = PBXGroup; + children = ( + F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */, + F379277024A0A52E0087FF2B /* Log.swift */, + F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */, + ); + path = "Supporting files"; + sourceTree = ""; + }; F86A895E243CD13100CBABC2 /* TestService */ = { isa = PBXGroup; children = ( @@ -454,12 +468,14 @@ 501FA512249B8F77002B5B54 /* WifiPlistManager.swift in Sources */, BCA4DFAB2438CF25002A862A /* WiFiPopoverView.swift in Sources */, BCF712F9243C8BE800BE3C05 /* StatusBarIconManager.swift in Sources */, + F3915F0724AB1A1B00E6614D /* itl_80211_state+Status.swift in Sources */, BCFA32EB2424D2BE00E23603 /* AppDelegate.swift in Sources */, BCCB2AA4243708090005BB82 /* WiFiMenuItemView.swift in Sources */, BCA4DFAD243A307B002A862A /* StatusMenu.swift in Sources */, 75FDF38B2481D22000B2A601 /* NetworkInfo.swift in Sources */, BCAF807F243DBA8C0034C8C7 /* JoinPopWindow.swift in Sources */, F379277424A0DADD0087FF2B /* WifiPopupWindow.swift in Sources */, + F34B2B8D24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/HeliPort/AppDelegate.swift b/HeliPort/AppDelegate.swift index 5b3ab577..59fce18c 100644 --- a/HeliPort/AppDelegate.swift +++ b/HeliPort/AppDelegate.swift @@ -26,7 +26,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { let statusBar = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) statusBar.button?.image = NSImage.init(named: "WiFiStateDisconnected") statusBar.button?.image?.isTemplate = true - statusBar.menu = StatusMenu.init(title: "") + statusBar.menu = StatusMenu() StatusBarIcon.statusBar = statusBar } diff --git a/HeliPort/Appearance/JoinPopWindow.swift b/HeliPort/Appearance/JoinPopWindow.swift index 75477c63..e10f494f 100644 --- a/HeliPort/Appearance/JoinPopWindow.swift +++ b/HeliPort/Appearance/JoinPopWindow.swift @@ -37,6 +37,19 @@ final class JoinPopWindow: NSWindow, NSTextFieldDelegate { private let joinButton: NSButton private let cancelButton: NSButton + convenience init() { + self.init( + contentRect: NSRect( + x: 0, + y: 0, + width: 450, + height: 247 + ), + styleMask: .titled, + backing: .buffered, + defer: false) + } + override init( contentRect: NSRect, styleMask style: NSWindow.StyleMask, @@ -547,4 +560,8 @@ final class JoinPopWindow: NSWindow, NSTextFieldDelegate { controlJoinButton() } + + func show() { + makeKeyAndOrderFront(self) + } } diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 35350c0f..6530ce89 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -17,76 +17,55 @@ import Foundation import Cocoa import Sparkle -class StatusMenu: NSMenu, NSMenuDelegate { - let heliPortUpdater = SUUpdater() +final class StatusMenu: NSMenu, NSMenuDelegate { - let networkListUpdatePeriod: Double = 5 - let statusUpdatePeriod: Double = 2 + // - MARK: Properties - var headerLength: Int = 0 - var networkListUpdateTimer: Timer? - var statusUpdateTimer: Timer? + private let heliPortUpdater = SUUpdater() - let statusItem = NSMenuItem( - title: NSLocalizedString("Wi-Fi: Status unavailable", comment: ""), - action: nil, - keyEquivalent: "" - ) - var status: UInt32 = 0 { + private let networkListUpdatePeriod: Double = 5 + private let statusUpdatePeriod: Double = 2 + + private var headerLength: Int = 0 + private var networkListUpdateTimer: Timer? + private var statusUpdateTimer: Timer? + + private var status: itl_80211_state = ITL80211_S_INIT { didSet { - var statusText = "" + guard isNetworkCardEnabled else { + StatusBarIcon.off() + statusItem.title = NSLocalizedString("Wi-Fi: Off", comment: "") + return + } + + statusItem.title = NSLocalizedString(status.description, comment: "") + switch status { - case ITL80211_S_INIT.rawValue: - statusText = "Wi-Fi: On" + case ITL80211_S_INIT: StatusBarIcon.disconnected() - case ITL80211_S_SCAN.rawValue: - statusText = "Wi-Fi: Looking for Networks..." - case ITL80211_S_AUTH.rawValue, ITL80211_S_ASSOC.rawValue: - statusText = "Wi-Fi: Connecting" + case ITL80211_S_AUTH, ITL80211_S_ASSOC: StatusBarIcon.connecting() - case ITL80211_S_RUN.rawValue: - statusText = "Wi-Fi: Connected" + case ITL80211_S_RUN: StatusBarIcon.connected() + case ITL80211_S_SCAN: + // no change in status bar icon when scanning + break default: - statusText = "Wi-Fi: Status unavailable" - } - if !isNetworkEnabled { - statusText = "Wi-Fi: Off" StatusBarIcon.off() } - statusItem.title = NSLocalizedString(statusText, comment: "") } } - let switchItem = NSMenuItem( - title: NSLocalizedString("Turn Wi-Fi Off", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ) - let bsdItem = NSMenuItem( - title: NSLocalizedString("Interface Name: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - let macItem = NSMenuItem( - title: NSLocalizedString("Address: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - let itlwmVerItem = NSMenuItem( - title: NSLocalizedString("Version: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - var networkItemList = [NSMenuItem]() - let maxNetworkListLength = MAX_NETWORK_LIST_LENGTH - let networkItemListSeparator: NSMenuItem = { + private var networkItemList = [NSMenuItem]() + + private let maxNetworkListLength = MAX_NETWORK_LIST_LENGTH + private let networkItemListSeparator: NSMenuItem = { let networkItemListSeparator = NSMenuItem.separator() networkItemListSeparator.isHidden = true return networkItemListSeparator }() - var showAllOptions: Bool = false { + private var showAllOptions: Bool = false { willSet(visible) { for idx in 0...6 { items[idx].isHidden = !visible @@ -97,28 +76,43 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - var isNetworkListEmpty: Bool = true { + private var isNetworkListEmpty: Bool = true { willSet(empty) { networkItemListSeparator.isHidden = empty - if empty { - for item in self.networkItemList { - if let view = item.view as? WifiMenuItemView { - view.visible = false - } + guard empty else { + return + } + + for item in self.networkItemList { + if let view = item.view as? WifiMenuItemView { + view.visible = false } } } } - var isNetworkEnabled: Bool = true { + private var isNetworkCardEnabled: Bool = false { willSet(newState) { switchItem.title = NSLocalizedString(newState ? "Turn Wi-Fi Off" : "Turn Wi-Fi On", comment: "") self.isNetworkListEmpty = !newState } } - override init(title: String) { - super.init(title: title) + // - MARK: Menu items + + private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) + private let switchItem = NSMenuItem( + title: NSLocalizedString("Turn Wi-Fi On", comment: ""), + action: #selector(clickMenuItem(_:)) + ) + private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") + private let macItem = NSMenuItem(title: NSLocalizedString("Address: ", comment: "") + "(null)") + private let itlwmVerItem = NSMenuItem(title: NSLocalizedString("Version: ", comment: "") + "(null)") + + // - MARK: Init + + init() { + super.init(title: "") minimumWidth = CGFloat(285.0) delegate = self setupMenuHeaderAndFooter() @@ -139,27 +133,20 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - func setupMenuHeaderAndFooter() { + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // - MARK: Setup + + private func setupMenuHeaderAndFooter() { addItem(bsdItem) addItem(macItem) addItem(itlwmVerItem) - addItem( - withTitle: NSLocalizedString("Enable Wi-Fi Logging", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - addItem( - withTitle: NSLocalizedString("Create Diagnostics Report...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Open Wireless Diagnostics...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self + addClickItem(title: NSLocalizedString("Enable Wi-Fi Logging", comment: "")) + addClickItem(title: NSLocalizedString("Create Diagnostics Report...", comment: "")) + addClickItem(title: NSLocalizedString("Open Wireless Diagnostics...", comment: "")) addItem(NSMenuItem.separator()) @@ -176,45 +163,19 @@ class StatusMenu: NSMenu, NSMenuDelegate { addItem(networkItemListSeparator) - addItem( - withTitle: NSLocalizedString("Join Other Network...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Create Network...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Open Network Preferences...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self + addClickItem(title: NSLocalizedString("Join Other Network...", comment: "")) + addClickItem(title: NSLocalizedString("Create Network...", comment: "")) + addClickItem(title: NSLocalizedString("Open Network Preferences...", comment: "")) addItem(NSMenuItem.separator()) - addItem( - withTitle: NSLocalizedString("About HeliPort", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Check for Updates...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Quit HeliPort", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "Q" - ).target = self + addClickItem(title: NSLocalizedString("About HeliPort", comment: "")) + addClickItem(title: NSLocalizedString("Check for Updates...", comment: "")) + addClickItem(title: NSLocalizedString("Quit HeliPort", comment: ""), keyEquivalent: "Q") } + // - MARK: Overrides + func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) { for item in networkItemList { if let view = item.view as? WifiMenuItemView { @@ -248,61 +209,35 @@ class StatusMenu: NSMenu, NSMenuDelegate { networkListUpdateTimer?.invalidate() } - @objc func clickMenuItem(_ sender: NSMenuItem) { - print(sender.title) - switch sender.title { - case NSLocalizedString("Turn Wi-Fi On", comment: ""): - power_on() - case NSLocalizedString("Turn Wi-Fi Off", comment: ""): - power_off() - case NSLocalizedString("Join Other Network...", comment: ""): - let joinPop = JoinPopWindow.init( - contentRect: NSRect( - x: 0, - y: 0, - width: 450, - height: 247 - ), - styleMask: .titled, - backing: .buffered, - defer: false - ) - joinPop.makeKeyAndOrderFront(self) - case NSLocalizedString("Create Network...", comment: ""): - let alert = NSAlert() - alert.messageText = NSLocalizedString("FUNCTION NOT IMPLEMENTED", comment: "") - alert.alertStyle = NSAlert.Style.critical - alert.runModal() - case NSLocalizedString("Open Network Preferences...", comment: ""): - NSWorkspace.shared.openFile("/System/Library/PreferencePanes/Network.prefPane") - case NSLocalizedString("Check for Updates...", comment: ""): - heliPortUpdater.checkForUpdates(self) - case NSLocalizedString("About HeliPort", comment: ""): - NSApplication.shared.orderFrontStandardAboutPanel() - NSApplication.shared.activate(ignoringOtherApps: true) - case NSLocalizedString("Quit HeliPort", comment: ""): - exit(0) - default: - print("Default") - } + // - MARK: Actions + + private func addClickItem(title: String, keyEquivalent: String = "") { + addItem( + withTitle: title, + action: #selector(clickMenuItem(_:)), + keyEquivalent: keyEquivalent + ).target = self } - func getDeviceInfo() { + private func getDeviceInfo() { DispatchQueue.global(qos: .background).async { var bsdName = NSLocalizedString("Unavailable", comment: "") var macAddr = NSLocalizedString("Unavailable", comment: "") var itlwmVer = NSLocalizedString("Unavailable", comment: "") var platformInfo = platform_info_t() + if is_power_on() { - print("Wi-Fi open") + Log.debug("Wi-Fi powered on") } else { - print("Wi-Fi close") + Log.debug("Wi-Fi powered off") } + if get_platform_info(&platformInfo) { bsdName = String(cString: &platformInfo.device_info_str.0) macAddr = NetworkManager.getMACAddressFromBSD(bsd: bsdName) ?? macAddr itlwmVer = String(cString: &platformInfo.driver_info_str.0) } + DispatchQueue.main.async { self.bsdItem.title = NSLocalizedString("Interface Name: ", comment: "") + bsdName self.macItem.title = NSLocalizedString("Address: ", comment: "") + macAddr @@ -311,22 +246,7 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - @objc func updateStatus() { - DispatchQueue.global(qos: .background).async { - var powerState: Bool = false - let get_power_ret = get_power_state(&powerState) - var status: UInt32 = 0xFF - get_80211_state(&status) - DispatchQueue.main.async { - if get_power_ret { - self.isNetworkEnabled = powerState - } - self.status = status - } - } - } - - func addNetworkItemPlaceholder() -> NSMenuItem { + private func addNetworkItemPlaceholder() -> NSMenuItem { let item = addItem( withTitle: "placeholder", action: #selector(clickMenuItem(_:)), @@ -351,21 +271,69 @@ class StatusMenu: NSMenu, NSMenuDelegate { view.heightAnchor.constraint(equalTo: supView.heightAnchor).isActive = true return item } - - @objc func updateNetworkInfo() { - if !isNetworkEnabled { + + // - MARK: Action handlers + + @objc private func clickMenuItem(_ sender: NSMenuItem) { + Log.debug("Clicked \(sender.title)") + + switch sender.title { + case NSLocalizedString("Turn Wi-Fi On", comment: ""): + power_on() + case NSLocalizedString("Turn Wi-Fi Off", comment: ""): + power_off() + case NSLocalizedString("Join Other Network...", comment: ""): + let joinPop = JoinPopWindow() + joinPop.show() + case NSLocalizedString("Create Network...", comment: ""): + let alert = NSAlert() + alert.messageText = NSLocalizedString("FUNCTION NOT IMPLEMENTED", comment: "") + alert.alertStyle = NSAlert.Style.critical + alert.runModal() + case NSLocalizedString("Open Network Preferences...", comment: ""): + NSWorkspace.shared.openFile("/System/Library/PreferencePanes/Network.prefPane") + case NSLocalizedString("Check for Updates...", comment: ""): + heliPortUpdater.checkForUpdates(self) + case NSLocalizedString("About HeliPort", comment: ""): + NSApplication.shared.orderFrontStandardAboutPanel() + NSApplication.shared.activate(ignoringOtherApps: true) + case NSLocalizedString("Quit HeliPort", comment: ""): + exit(0) + default: + Log.error("Invalid menu item clicked") + } + } + + @objc private func updateStatus() { + DispatchQueue.global(qos: .background).async { + var powerState: Bool = false + let get_power_ret = get_power_state(&powerState) + var status: UInt32 = 0xFF + get_80211_state(&status) + + DispatchQueue.main.async { + if get_power_ret { + self.isNetworkCardEnabled = powerState + } + self.status = itl_80211_state(rawValue: status) + } + } + } + + @objc private func updateNetworkInfo() { + guard isNetworkCardEnabled else { return } - + DispatchQueue.global(qos: .background).async { var info = station_info_t() get_station_info(&info) - print(String(format: "current rate=%03d", info.rate)) + Log.debug(String(format: "current rate=%03d", info.rate)) } } - @objc func updateNetworkList() { - if !isNetworkEnabled { + @objc private func updateNetworkList() { + guard isNetworkCardEnabled else { return } @@ -380,8 +348,4 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } } diff --git a/HeliPort/Log.swift b/HeliPort/Supporting files/Log.swift similarity index 73% rename from HeliPort/Log.swift rename to HeliPort/Supporting files/Log.swift index a49b74f4..cb688f58 100644 --- a/HeliPort/Log.swift +++ b/HeliPort/Supporting files/Log.swift @@ -13,4 +13,8 @@ final class Log { static func debug(_ message: String) { os_log("%@", log: .default, type: .debug, message) } + + static func error(_ message: String) { + os_log("%@", log: .default, type: .error, message) + } } diff --git a/HeliPort/Supporting files/NSMenuItem+Extensions.swift b/HeliPort/Supporting files/NSMenuItem+Extensions.swift new file mode 100644 index 00000000..6e2c5c19 --- /dev/null +++ b/HeliPort/Supporting files/NSMenuItem+Extensions.swift @@ -0,0 +1,20 @@ +// +// NSMenuItem+Extensions.swift +// HeliPort +// +// Created by Igor Kulman on 29/06/2020. +// Copyright © 2020 OpenIntelWireless. All rights reserved. +// + +import Foundation +import Cocoa + +extension NSMenuItem { + convenience init(title: String) { + self.init(title: title, action: nil, keyEquivalent: "") + } + + convenience init(title: String, action: Selector) { + self.init(title: title, action: action, keyEquivalent: "") + } +} diff --git a/HeliPort/Supporting files/itl_80211_state+Status.swift b/HeliPort/Supporting files/itl_80211_state+Status.swift new file mode 100644 index 00000000..d7dca9ff --- /dev/null +++ b/HeliPort/Supporting files/itl_80211_state+Status.swift @@ -0,0 +1,26 @@ +// +// itl_80211_state+Status.swift +// HeliPort +// +// Created by Igor Kulman on 30/06/2020. +// Copyright © 2020 OpenIntelWireless. All rights reserved. +// + +import Foundation + +extension itl_80211_state: CustomStringConvertible { + public var description: String { + switch self { + case ITL80211_S_INIT: + return "Wi-Fi: On" + case ITL80211_S_SCAN: + return "Wi-Fi: Looking for Networks..." + case ITL80211_S_AUTH, ITL80211_S_ASSOC: + return "Wi-Fi: Connecting" + case ITL80211_S_RUN: + return "Wi-Fi: Connected" + default: + return "Wi-Fi: Off" + } + } +}