diff --git a/XIONControlPanel.xcodeproj/project.pbxproj b/XIONControlPanel.xcodeproj/project.pbxproj index 237ac48..a8f8d64 100644 --- a/XIONControlPanel.xcodeproj/project.pbxproj +++ b/XIONControlPanel.xcodeproj/project.pbxproj @@ -247,7 +247,7 @@ TargetAttributes = { 0C3CAEA31C3350C800B856AD = { CreatedOnToolsVersion = 7.2; - DevelopmentTeam = TNUURJU7SZ; + DevelopmentTeam = FZ6BMA5HA9; }; }; }; diff --git a/XIONControlPanel/Controllers/MainViewController.swift b/XIONControlPanel/Controllers/MainViewController.swift index ff7e007..a46d529 100644 --- a/XIONControlPanel/Controllers/MainViewController.swift +++ b/XIONControlPanel/Controllers/MainViewController.swift @@ -138,7 +138,7 @@ class MainViewController: UIViewController, SwitchesViewControllerDelegate { var activatedDevicesCount = 0 for device in self.devices { if (device.state == .On) { - ++activatedDevicesCount + activatedDevicesCount += 1 } } diff --git a/XIONControlPanel/Controllers/SwitchesViewController.swift b/XIONControlPanel/Controllers/SwitchesViewController.swift index 9b83e41..d97e12a 100644 --- a/XIONControlPanel/Controllers/SwitchesViewController.swift +++ b/XIONControlPanel/Controllers/SwitchesViewController.swift @@ -48,7 +48,7 @@ class SwitchesViewController: UIViewController, static let count: Int = { var max = 0 - while let _ = ActionCell(rawValue: max) { ++max } + while let _ = ActionCell(rawValue: max) { max += 1 } return max }() } @@ -104,7 +104,7 @@ class SwitchesViewController: UIViewController, // if we have devices now and we didn't before, or vice versa, // we need to update the action cells if ((oldValue.count == 0 && self.devices.count != 0) || (self.devices.count == 0 && oldValue.count != 0)) { - for var actionCellIdx = 0; actionCellIdx < ActionCell.count; ++actionCellIdx { + for actionCellIdx in 0 ..< ActionCell.count { let actionCellIndexPath = NSIndexPath(forItem: actionCellIdx, inSection: 0) updatedIndexPaths.append(actionCellIndexPath) } @@ -197,7 +197,7 @@ class SwitchesViewController: UIViewController, let tappedActionCell = ActionCell(rawValue: indexPath.item) var currentDelay: NSTimeInterval = 0.0 - for var i = ActionCell.count; i < collectionView.numberOfItemsInSection(indexPath.section); ++i { + for i in ActionCell.count ..< collectionView.numberOfItemsInSection(indexPath.section) { let cell = collectionView.cellForItemAtIndexPath(NSIndexPath(forItem: i, inSection: indexPath.section)) as! WemoDeviceCellView let animOptions = UIViewAnimationOptions([.AllowUserInteraction]) diff --git a/XIONControlPanel/Controllers/VisualizationViewController.swift b/XIONControlPanel/Controllers/VisualizationViewController.swift index 602bde2..a9a1c21 100644 --- a/XIONControlPanel/Controllers/VisualizationViewController.swift +++ b/XIONControlPanel/Controllers/VisualizationViewController.swift @@ -50,6 +50,8 @@ class VisualizationViewController: UIViewController { _setupModel() _setupAnimation() _setupEffects() + + _beginModelResetTimer() } override func viewDidAppear(animated: Bool) @@ -110,7 +112,7 @@ class VisualizationViewController: UIViewController { for cublet in shuffledCublets { _setCubletActivated(cublet, activated: (cubletsActivated < cubletsToActivate)) - ++cubletsActivated + cubletsActivated += 1 } if (animated) { @@ -175,6 +177,7 @@ class VisualizationViewController: UIViewController { internal func _setupModel() { + _cubletsNode.enumerateChildNodesUsingBlock { $0.0.removeFromParentNode() } _cublets.removeAll() let sz = Float(VisualizationViewController.cubletsSize) @@ -191,13 +194,13 @@ class VisualizationViewController: UIViewController { material.transparency = 0.75 // generate nodes for each cublet - for var xi = 0; xi < dim; ++xi { + for xi in 0 ..< dim { let x = orig + Float(xi) * (sz + spacing) - for var yi = 0; yi < dim; ++yi { + for yi in 0 ..< dim { let y = orig + Float(yi) * (sz + spacing) - for var zi = 0; zi < dim; ++zi { + for zi in 0 ..< dim { let z = orig + Float(zi) * (sz + spacing) let nodeGeom = geom.copy() as! SCNGeometry @@ -212,7 +215,9 @@ class VisualizationViewController: UIViewController { } _cubletsNode.position = SCNVector3Zero - _scene.rootNode.addChildNode(_cubletsNode) + if (_cubletsNode.parentNode == nil) { + _scene.rootNode.addChildNode(_cubletsNode) + } } internal func _setupAnimation() @@ -220,6 +225,7 @@ class VisualizationViewController: UIViewController { let rotAngle = 2.0 * π let rotAxis = SCNVector3Make(0.25, 1.75, 1.0) let rotationAction = _createLongTermRotationAnimation(rotAngle, rotAxis) + _cubletsNode.removeAllActions() _cubletsNode.runAction(rotationAction, forKey: VisualizationViewController.rotationAnimationKey) } @@ -232,6 +238,30 @@ class VisualizationViewController: UIViewController { _sceneView?.technique = technique } + internal func _beginModelResetTimer() + { + /* since this visualization is running all the time, trigonometric functions begin + malfunctioning at very large numbers. just reload the model every 24 hours so we + don't have to see it */ + let reloadModelTime = dispatch_time(DISPATCH_TIME_NOW, Int64(60 * 60 * 24 * NSEC_PER_SEC)) + dispatch_after(reloadModelTime, dispatch_get_main_queue()) { [weak self] in + if let strongSelf = self { + strongSelf._cubletsNode.removeFromParentNode() + strongSelf._cubletsNode = SCNNode() + + strongSelf._setupModel() + strongSelf._setupAnimation() + + let currentPercentActivated = strongSelf.percentActivated + let currentConnectionStatus = strongSelf.connectionStatus + strongSelf.percentActivated = currentPercentActivated + strongSelf.connectionStatus = currentConnectionStatus + + strongSelf._beginModelResetTimer() + } + } + } + internal func _setCubletActivated(cublet: SCNNode, activated: Bool) { let material = cublet.geometry?.firstMaterial @@ -241,11 +271,12 @@ class VisualizationViewController: UIViewController { internal func _setAnimationSpeed(speed: CGFloat) { let key = VisualizationViewController.rotationAnimationKey - let action = _cubletsNode.actionForKey(key) - _cubletsNode.removeActionForKey(key) - - action?.speed = speed - _cubletsNode.runAction(action!, forKey: key) + if let action = _cubletsNode.actionForKey(key) { + _cubletsNode.removeActionForKey(key) + + action.speed = speed + _cubletsNode.runAction(action, forKey: key) + } } internal func _createLongTermRotationAnimation(rotAngle: CGFloat, _ rotAxis: SCNVector3) -> SCNAction