2017-01-13 3 views
1

Ich habe Probleme, die Position eines realen Geräts mit einem UISlider zu steuern. Das Gerät akzeptiert Richtungsbefehle (einfahren oder ausfahren), nicht aber einen Befehl für eine absolute Position. Es zeigt seine aktuelle Position an, wenn es abgefragt wird.Was ist der richtige Weg, um ein Gerät mit verzögerter Rückmeldung zu überwachen und zu steuern?

Wenn das Gerät beispielsweise auf Position 50 steht und ich die gewünschte Position mit einem UISlider auf 25 setze, befiehlt das Programm dem Gerät, in Richtung 25 zu fahren. Es kann einige Sekunden dauern, und sobald es 25 erreicht, befehle ich dem Gerät zu stoppen. Mein aktueller (ungetestet) Code wie folgt aussieht:

func sliderMoved(_ label : UILabel, openCharacteristicNum : Int, closeCharacteristicNum : Int, sender: UISlider){ 
     let actuatorPosition = getActuatorPosition(label) 

     // run this on a background thread 
     DispatchQueue.global(qos: .background).async { 
      if (actuatorPosition > sender.value) { 
       // stop closing and start opening 
       self.writeValue(closeCharacteristicNum, value: 1) 
       self.writeValue(openCharacteristicNum, value: 0) 
       while actuatorPosition > sender.value { 
        actuatorPosition = getActuatorPosition(label) 
       } 
       // stop opening 
       self.writeValue(openCharacteristicNum, value: 1) 
      } 
      else if (actuatorPosition < sender.value) { 
       // stop opening and start closing 
       self.writeValue(openCharacteristicNum, value: 1) 
       self.writeValue(closeCharacteristicNum, value: 0) 
       while actuatorPosition < sender.value { 
        actuatorPosition = getActuatorPosition(label) 
       } 
       // stop closing 
       self.writeValue(closeCharacteristicNum, value: 1) 
      } 
     } 

    } 

Das fühlt sich an wie ein sehr ineffizienter Weg, um das Problem zu lösen (ich bin kein Fan von Fäden mit While-Schleifen zu blockieren), aber ich habe Probleme kommen mit einem besseren Weg.

+1

Das Gerät ist eher "dumm". Es kann einen Richtungsbefehl akzeptieren, aber keinen Befehl, um zu einer absoluten Position zu gelangen, so dass es nicht weiß, wann es sein Ziel erreicht hat. Ich habe die Frage zur besseren Übersicht bearbeitet. –

Antwort

0

Ich benutzte einen Timer, um die Position des Geräts regelmäßig zu überwachen, was viel besser war als While-Schleifen.

Verwandte Themen