2016-08-02 20 views
3

由於沒有使用OBD2Kit的示例代碼,Swift I將它分爲https://github.com/YannisDC/OBD2Kit並將其用作pod。OBD2Kit Swift示例不能強制轉換,繼續獲取nil

我翻譯了一些OBJ-C示例代碼,但似乎無法將FLWiFiScanTool翻譯成ELM327類型。爲什麼我一直得到零?

import UIKit 
import OBD2Kit 

class ViewController: UIViewController, FLScanToolDelegate { 

    @IBOutlet weak var hostIpAddress: UITextField! 

    var scanTool: ELM327! 

    @IBOutlet weak var statusLabel: UILabel! 
    @IBOutlet weak var scanToolLabel: UILabel! 
    @IBOutlet weak var rpmLabel: UILabel! 
    @IBOutlet weak var speedLabel: UILabel! 
    @IBOutlet weak var tempLabel: UILabel! 
    var scanning = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.hostIpAddress.text = "192.168.0.10" 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func scanButton(sender: UIButton) { 
     if !scanning { 
      startScan() 
     } else { 
      stopScan() 
     } 
    } 

    func startScan() { 
     if let scanTool = ELM327(host: self.hostIpAddress.text!, andPort: 35000) { 
      self.statusLabel.text = "Initializing..." 
      scanTool.useLocation = true 
      scanTool.delegate = self 
      scanTool.startScanWithSensors({() -> [AnyObject] in 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        self.statusLabel.text = "Scanning..." 
        self.scanToolLabel.text = scanTool.scanToolName 
       }) 

//    let sensors: [AnyObject] = [ OBD2Sensor.SensorEngineRPM as! AnyObject, 
//            OBD2Sensor.SensorVehicleSpeed as! AnyObject, 
//            OBD2Sensor.SensorOxygenSensorsPresent as! AnyObject ] 

       let sensors: [AnyObject] = [ 0x0C, 
               0x0D, 
               0x13 ] 
       return sensors 
      }) 
      self.scanTool = scanTool 
      print("So far succesfull") 
      scanning = !scanning 
     } else { 
      self.statusLabel.text = "Not working" 
     } 
    } 

    func stopScan() { 
     statusLabel.text = "Stopped" 
     let scanTool: ELM327 = self.scanTool 
     scanTool.cancelScan() 
     scanTool.sensorScanTargets = nil 
     scanTool.delegate = nil 
     scanning = !scanning 
    } 

    // MARK: - FLScanToolDelegate 


    func scanTool(scanTool: FLScanTool, sensor: FLECUSensor) { 
     var sensorLabel: UILabel? = nil 
     switch sensor.pid { 

     case OBD2Sensor.SensorEngineRPM: 
      sensorLabel = self.rpmLabel 

     case OBD2Sensor.SensorVehicleSpeed: 
      sensorLabel = self.speedLabel 

     default: 
      sensorLabel = self.tempLabel 
     } 

     self.showSensorValue(sensor, onLabel: sensorLabel!) 
    } 

    func showSensorValue(sensor: FLECUSensor, onLabel label: UILabel) { 
     let sensorValue: String = "\(sensor.valueStringForMeasurement1(false)) \(sensor.imperialUnitString)" 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      label.text = sensorValue 
     }) 
    } 

} 

編輯1:

我已經可以掃描工具,因爲現在ELM327是FLWiFiScanTool,而不是周圍的其他方式。我可以獲取工具名稱,以便連接,但似乎無法獲取傳感器輸出。

+0

可以'scanToolWithHost'失敗? – Avi

+0

什麼是'FLWifiScanTool'返回? – Paulw11

+1

請刪除*問題*中的所有「已解決」部分,並將解決方案發布爲*答案*。謝謝。 – Moritz

回答

0

我設法弄明白了。預期的傳感器陣列應該是NSNumbers之一,所以我將傳感器UInt轉換成NSNumbers。 我也錯過了scanTool函數中的didUpdateSensor部分。

確保使用公制系統,這在某種程度上對我來說更可靠。 (我的車是使用公制爲好,也許這就是爲什麼。)

import UIKit 
import OBD2Kit 

class ViewController: UIViewController, FLScanToolDelegate { 
    var scanTool: ELM327! 

    @IBOutlet weak var statusLabel: UILabel! 
    @IBOutlet weak var scanToolLabel: UILabel! 
    @IBOutlet weak var rpmLabel: UILabel! 
    @IBOutlet weak var speedLabel: UILabel! 
    @IBOutlet weak var tempLabel: UILabel! 
    var scanning = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    @IBAction func scanButton(sender: UIButton) { 
     if !scanning { 
      startScan() 
     } else { 
      stopScan() 
     } 
    } 

    func startScan() { 
     if let scanTool = ELM327(host: "192.168.0.10", andPort: 35000) { 
      self.statusLabel.text = "Initializing..." 
      scanTool.useLocation = true 
      scanTool.delegate = self 
      scanTool.startScanWithSensors({() -> [AnyObject] in 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        self.statusLabel.text = "Scanning..." 
        self.scanToolLabel.text = scanTool.scanToolName 
       }) 

       let sensors: [AnyObject] = [ OBD2Sensor.SensorEngineRPM as NSNumber, OBD2Sensor.SensorVehicleSpeed as NSNumber, OBD2Sensor.SensorOxygenSensorsPresent as NSNumber ] 

       return sensors 
      }) 
      self.scanTool = scanTool 
      print("So far succesfull") 
      scanning = !scanning 
     } else { 
      self.statusLabel.text = "Not working" 
     } 
    } 

    func stopScan() { 
     statusLabel.text = "Stopped" 
     let scanTool: ELM327 = self.scanTool 
     scanTool.cancelScan() 
     scanTool.sensorScanTargets = nil 
     scanTool.delegate = nil 
     scanning = !scanning 
    } 

    // MARK: - FLScanToolDelegate 

    func scanTool(scanTool: FLScanTool!, didUpdateSensor sensor: FLECUSensor!) { 
     var sensorLabel: UILabel? = nil 
     switch sensor.pid { 

     case OBD2Sensor.SensorEngineRPM: 
      sensorLabel = self.rpmLabel 

     case OBD2Sensor.SensorVehicleSpeed: 
      sensorLabel = self.speedLabel 

     default: 
      sensorLabel = self.tempLabel 
     } 

     self.showSensorValue(sensor, onLabel: sensorLabel!) 
    } 

    func showSensorValue(sensor: FLECUSensor, onLabel label: UILabel) { 
     let sensorValue: String = "\(sensor.valueStringForMeasurement1(true)) \(sensor.metricUnitString)" 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      label.text = sensorValue 
     }) 
    } 

} 
相關問題