指挥控制系统(多信号显示控制)

6 篇文章 0 订阅
1 篇文章 0 订阅

 效果如图:对信号源进行各种手势操作,通过wifi控制大屏显示的内容,如何显示自由定制

中控效果图标题效果图
​​

主要技术用到socketIO版本为10.0.0,服务器的socketIO不一致的情况下回出错,上代码了

1.由于数据需要大量的全局便于定制扩展,写个数据管理的单例

import UIKit
enum AckModel {
    case SceneActiveModel
    case WindowMoveModel
    case WindowDeleted
    case WindowCreated
    case NewInputNodeAry
    case ConnectFail
    case SceneCreated
    case SceneChanged
    case SceneDeleted
    case WallCreated
    case WallDeleted
    case WallSlotBinded
    case WallLayoutChanged
    case WallRowHeightChanged
    case WallColWidthChanged
    case WallNameChanged
    case WindowSignalChanged
    case AllWindowsDeleted
}
protocol VPScreenDelegate: NSObjectProtocol {
    func CallBack(dataArray: Any,type:AckModel)
}
class DataMananger: NSObject {
    //MARK:socket
    //当前墙记录 CurrentWall
    var currentWall :CYWall?
    var currentScene :CYScene?
    var  socketClinet : SocketIOClient?
    weak var delegate:VPScreenDelegate?
    static let shared = DataMananger()
    var timer: Timer?
    
    //MARK:数据的数组
    
    lazy  var sceneWindowArray:[CYSceneWindow] = {
        
        var foo : [CYSceneWindow] = [CYSceneWindow]()
        return foo
    }()
    lazy  var scenesArray:[CYScene] = {
        var foo : [CYScene] = [CYScene]()
        return foo
    }()
    lazy var signalsArray:[CYSignal] = {
        var foo : [CYSignal] = [CYSignal]()
        return foo
    }()
    lazy var wallsArray:[CYWall] = {
        var foo : [CYWall] = [CYWall]()
        return foo
    }()
    lazy var resultArray:[Any] = {
        var foo : [Any] = [Any]()
        return foo
    }()
    lazy var inputNodesArray:[CYInputNode] = {
        var foo : [CYInputNode] = [CYInputNode]()
        return foo
    }()
    lazy var currentScenesArr:[CYScene]={
        var foo : [CYScene] = [CYScene]()
        return foo
    }()
    lazy var currentWindowsArr:[CYSceneWindow]={
        var foo : [CYSceneWindow] = [CYSceneWindow]()
        return foo
    }()
    //List call listen
    func VPhandleEvent() {
        /*
         连接状态监听
         */
        self.socketClinet?.on("connect"){ data, ack in
            
        }
        self.socketClinet?.on(clientEvent: .disconnect) {data, ack in
            print("Test: Disconnect")
        }
        
        self.socketClinet!.on(clientEvent: .statusChange) {data, ack in
            print("Test: statusChange")
        }
        /*
         Window状态监听
         */
        self.socketClinet!.on("WindowCreated") {data, ack in
            let dic = data[0] as? [String: Any]
            let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
            self.sceneWindowArray.append(windowModel!)
            self.delegate?.CallBack(dataArray: data, type: AckModel.WindowCreated)
        }
        self.socketClinet!.on("WindowDeleted") {data, ack in
            let dic = data[0] as? [String: Any]
            let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
            for (index, model) in self.sceneWindowArray.enumerated() {
                if model.id == windowModel?.id {
                    self.sceneWindowArray.remove(at: index)
                    break
                }
            }
            self.delegate?.CallBack(dataArray: data, type: AckModel.WindowDeleted)
        }
        self.socketClinet!.on("WindowMoved") {data, ack in
            let dic = data[0] as? [String: Any]
            let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
            for (index, model) in self.sceneWindowArray.enumerated() {
                if model.id == windowModel?.id {
                    self.sceneWindowArray.remove(at: index)
                    break
                }
            }
            self.sceneWindowArray.append(windowModel!)
            self.delegate?.CallBack(dataArray: data, type: AckModel.WindowMoveModel)
        }
        self.socketClinet!.on("WindowSignalChanged") {data, ack in
            let dic = data[0] as? [String: Any]
            let windowModel = CYSceneWindow.deserialize(from: dic!["window"] as? [String: Any])
            for (index, model) in self.sceneWindowArray.enumerated() {
                if model.id == windowModel?.id {
                    self.sceneWindowArray.remove(at: index)
                    self.sceneWindowArray.insert(windowModel!, at: index)
                    break
                }
            }
            self.delegate?.CallBack(dataArray: data, type: AckModel.WindowSignalChanged)
        }
        self.socketClinet!.on("AllWindowsDeleted") {data, ack in
            self.sceneWindowArray.removeAll()
            self.delegate?.CallBack(dataArray: data, type: AckModel.AllWindowsDeleted)
        }
        /*
         墙 Wall状态监听
         */
        self.socketClinet!.on("WallCreated") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let newWall :CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
            self.wallsArray.append(newWall)
            self.delegate?.CallBack(dataArray: newWall, type: AckModel.WallCreated)
        }
        self.socketClinet!.on("WallDeleted") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let deleteWall: CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
            for (index, wall) in self.wallsArray.enumerated() {
                if wall.id == deleteWall.id {
                    self.wallsArray.remove(at: index)
                    break
                }
            }
            self.refreshCurrentWall()
            self.delegate?.CallBack(dataArray: deleteWall, type: AckModel.WallDeleted)
        }
        self.socketClinet!.on("WallSlotBinded") {data, ack in
            replaceWallModel(data)
            self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallSlotBinded)
        }
        self.socketClinet!.on("WallLayoutChanged") {data, ack in
            replaceWallModel(data)
            self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallLayoutChanged)
        }
        self.socketClinet!.on("WallRowHeightChanged") {data, ack in
            replaceWallModel(data)
            self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallRowHeightChanged)
        }
        self.socketClinet!.on("WallColWidthChanged") {data, ack in
            replaceWallModel(data)
            self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallColWidthChanged)
        }
        self.socketClinet!.on("WallNameChanged") {data, ack in
            replaceWallModel(data)
            self.delegate?.CallBack(dataArray: [Any](), type: AckModel.WallNameChanged)
        }
        func replaceWallModel(_ data: [Any]) {
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let changeWall :CYWall = CYWall.deserialize(from: dic.object(forKey: "wall") as? [String:Any])!
            for (index, wall) in self.wallsArray.enumerated() {
                if wall.id == changeWall.id {
                    self.wallsArray.remove(at: index)
                    self.wallsArray.insert(changeWall, at: index)
                    break
                }
            }
        }
        /*
         Scene 状态监听
         */
        self.socketClinet!.on("SceneCreated") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let newScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
            self.scenesArray.append(newScene)
            self.updateCurrentSceneArray()
            self.delegate?.CallBack(dataArray: newScene, type: AckModel.SceneCreated)
        }
        self.socketClinet!.on("SceneChanged") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let changeScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
            for scene in self.scenesArray {
                if scene.id == changeScene.id {
                    scene.name = changeScene.name
                    break
                }
            }
            self.updateCurrentSceneArray()
            self.delegate?.CallBack(dataArray: changeScene, type: AckModel.SceneCreated)
        }
        self.socketClinet!.on("SceneDeleted") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let deleteScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
            for (index, scene) in self.scenesArray.enumerated() {
                if scene.id == deleteScene.id {
                    self.scenesArray.remove(at: index)
                    break
                }
            }
            self.updateCurrentSceneArray()
            self.delegate?.CallBack(dataArray: deleteScene, type: AckModel.SceneCreated)
        }
        self.socketClinet!.on("SceneActived") {data, ack in
            let sceneArr:NSArray = data as NSArray
            let dic:NSDictionary = sceneArr[0] as! NSDictionary
            let activeScene :CYScene = CYScene.deserialize(from: dic.object(forKey: "scene") as? [String:Any])!
            self.delegate?.CallBack(dataArray: activeScene, type: AckModel.SceneActiveModel)
        }
        /*
         InputNode 状态监听
         */
        self.socketClinet!.on("InputNodeCablesChanged") {data, ack in
            //            self.inputNodeCabChangeDelegate?.InputNodeCabChangeDelegate(data: data)
        }
        self.socketClinet!.on("InputNodeChanged") {data, ack in
            //            self.inputNodeChanageDelegate?.InputNodeChangedDelegate(data: data)
        }
        self.socketClinet!.on("InputNodeCreated") {data, ack in
            //            self.inputNodeCreatedDelegate?.InputNodeCreatedDelegate(data: data)
        }
        self.socketClinet!.on("InputNodeDeleted") {data, ack in
            //            self.inputNodeDeletedDelegate?.InputNodeDeletedDelegate(data: data)
        }
        /*
         Signal 信号状态监听
         */
        self.socketClinet!.on("SignalCreated") {data, ack in
        }
        self.socketClinet!.on("SignalDeleted") {data, ack in
        }
        self.socketClinet!.on("SignalUpdated") {data, ack in
        }
    }
    private  override init() {
        super.init()
        registerDefaultsFromSettingsBundle()
        getSettingsBundlValue()
        self.timer = Timer.scheduledTimer(timeInterval: Double(UpdateFPS!)!, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
        self.timer?.fireDate = Date()
        let sokctURL = "http://" + IPAddress! + ":9093"
        self.socketClinet = SocketIOClient.init(socketURL: URL(string: sokctURL)!)
        self.socketClinet?.joinNamespace("/domain")
        self.VPhandleEvent()
        self.socketClinet?.connect()
    }
    //MARK: - 读取SettingsBundle
    func getSettingsBundlValue() {
        IPAddress = (UserDefaults.standard.object(forKey: "splice_ip") as! String)
        UpdateFPS = (UserDefaults.standard.object(forKey: "fps") as! String)
    }
    func registerDefaultsFromSettingsBundle() {
        let settingsBundle = Bundle.main.path(forResource: "Settings", ofType: "bundle")
        if settingsBundle == nil {
            print("Could not find Settings.bundle")
            return
        }
        let str = settingsBundle!+"/Root.plist"
        let settings = NSDictionary(contentsOfFile: str)
        let preferences = settings!["PreferenceSpecifiers"] as! [[String: Any]]
        var defaultsToRegister = [String: String]()
        for dic in preferences {
            if let key = dic["Key"] {
                defaultsToRegister.updateValue(dic["DefaultValue"]! as! String, forKey: key as! String)
            }
        }
        UserDefaults.standard.register(defaults: defaultsToRegister)
        UserDefaults.standard.synchronize()
    }

    @objc func timerAction() {
        if inputNodesArray.count > 0 {
            NetManage.getNearsFramesWithInputNodes(inputNodesArray: inputNodesArray) { (newInputNodesArray, error) in
                if error == nil {
                    self.delegate?.CallBack(dataArray: newInputNodesArray as Any, type: AckModel.NewInputNodeAry)
                }else{
                    self.delegate?.CallBack(dataArray: [] as Any, type: AckModel.ConnectFail)
                }
            }
        }
    }
    func refreshData(result:@escaping(_ success:Bool)->Void){
        SVProgressHUD.show()
        SVProgressHUD.setDefaultMaskType(.clear)
        NetManage.getAllWalls { (Walldata, err) in
            //墙获取
            if err == nil{
                self.wallsArray.removeAll()
                for dic in Walldata as! [Any]{
                    let wall = CYWall.deserialize(from: dic as? [String:Any])
                    print(wall!.name)
                    self.wallsArray.append(wall!)
                }
                //            场景获取
                NetManage.getAllScenes(result: { (sceneData, err) in
                    if err == nil {
                        self.scenesArray.removeAll()
                        for dic in sceneData as! [Any]{
                            let scene = CYScene.deserialize(from: dic as? [String:Any])
                            self.scenesArray.append(scene!)
                        }
                        //getSceneWindow  窗口
                        NetManage.getAllSceneWindows(result: { (windowsData, err) in
                            if err == nil {
                                self.sceneWindowArray.removeAll()
                                for dic in windowsData as! [Any]{
                                    let window = CYSceneWindow.deserialize(from: dic as? [String:Any])
                                    self.sceneWindowArray.append(window!)
                                }
                                NetManage.getAllInputNodes(result: { (inputData, err) in
                                    if err == nil {
                                        self.inputNodesArray.removeAll()
                                        for dic in inputData as! [Any]{
                                            let inputNode = CYInputNode.deserialize(from: dic as? [String:Any])
                                            self.inputNodesArray.append(inputNode!)
                                        }
                                        NetManage.getAllSignal(result: { (signalData, err) in
                                            if err == nil {
                                                self.signalsArray.removeAll()
                                                for (index, dic) in (signalData as! [Any]).enumerated() {
                                                    let signal = CYSignal.deserialize(from: dic as? [String:Any])
                                                    if let v = UserDefaults.standard.value(forKey: (signal?.id)!) {
                                                        signal?.orderIndex = v as! Int
                                                    }else{
                                                        signal?.orderIndex = index
                                                        UserDefaults.standard.set(index, forKey: (signal?.id)!)
                                                        UserDefaults.standard.synchronize()
                                                    }
                                                    self.signalsArray.append(signal!)
                                                }
                                                self.signalsArray.sort(by: { (v1, v2) -> Bool in
                                                    v1.orderIndex < v2.orderIndex
                                                })
//                                                print(self.signalsArray.count,self.inputNodesArray.count,self.wallsArray.count,self.sceneWindowArray.count)
                                                result(true)
                                            }else{
                                                result(false)
                                            }
                                        })
                                    }else{
                                        result(false)
                                    }
                                })
                            }else{
                                result(false)
                            }
                        })
                    }else{
                        result(false)
                    }
                })
            }else{
                result(false)
            }
        }
    }
    func refreshCurrentWall(){
        //let defaults1 = UserDefaults.standard
        var wallIndex  = defaults.integer(forKey: "currentWall")
        if wallIndex >= self.wallsArray.count {
            wallIndex = 0
            defaults.set(0, forKey: "currentWall")
            defaults.synchronize()
        }
        self.currentWall = self.wallsArray[wallIndex]
        self.updateCurrentSceneArray()
    }
    func updateCurrentSceneArray(){
        self.currentScenesArr.removeAll()
        for scene in scenesArray {
            if scene.wallid == currentWall?.id {
                currentScenesArr.append(scene)
                //获取当前场景
                if scene.id == self.currentWall!.activeSceneId{
                    self.currentScene = scene
                }
            }
        }
        self.getCurrentWindowsArray()
    }
    //
    func getCurrentWindowsArray(){
        self.currentWindowsArr.removeAll()
        for windowModel in self.sceneWindowArray {
            
            if windowModel.sceneid == self.currentScene?.id{
                self.currentWindowsArr.append(windowModel)
                
            }
        }
    }
    func didSelectedWallActive(index:Int){
        self.currentWall = self.wallsArray[index]
        defaults.set(index, forKey: "currentWall")
        
    }
    func didSelectedSceneActive(id:String){
        
    }
}

    单例的生成

    static let shared = DataMananger()

   SocketIO的连接:

    let sokctURL = "http://" + IPAddress! + ":9093"
        self.socketClinet = SocketIOClient.init(socketURL: URL(string: sokctURL)!)
        self.socketClinet?.joinNamespace("/domain")
        self.VPhandleEvent()
        self.socketClinet?.connect()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值