2016-08-02 2 views
3

Так как не было примера кода для использования OBD2Kit и Swift I, он разворачивал его в https://github.com/YannisDC/OBD2Kit и использовал его как стручок.OBD2Kit Пример Swift не может быть приписанным, продолжайте получать нуль

Я перевел некоторый пример кода 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 
     }) 
    } 

} 

Edit 1:

Я уже могу отсканировать для инструмента в настоящее время, так как ELM327 является FLWiFiScanTool, а не наоборот. Я могу получить имя инструмента, так что он подключается, но, похоже, не может получить выход датчиков.

+0

Может 'scanToolWithHost' потерпеть неудачу? – Avi

+0

Что возвращает 'FLWifiScanTool'? – Paulw11

+1

Пожалуйста, удалите все «разрешенные» части из вашего * вопроса * и разместите свое решение как * ответ *. Спасибо. – Moritz

ответ

0

Мне удалось выяснить это. Ожидаемая матрица датчиков должна быть одной из NSNumbers, поэтому я подал датчики UInt в NSNumbers. И я также пропустил часть didUpdateSensor в функции scanTool.

Обязательно используйте метрическую систему, это как-то более надежно в моем случае. (Мой автомобиль использует метрическую систему, а также, может быть, поэтому.)

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 
     }) 
    } 

} 
Смежные вопросы