2016-07-07 13 views
2

私が試しているように見えますが、現在、iOS/SocketScan APIからバッテリレベルを取り戻すことはできません。私は、バージョン10.3.36を使用しています、ここに私のコードは、これまでのところです:SocketScanスウィフトでバッテリレベルを取得

func onDeviceArrival(result: SKTRESULT, device deviceInfo: DeviceInfo!) { 
    print("onDeviceArrival:\(deviceInfo.getName())") 
scanApiHelper.postGetBattery(deviceInfo, target: self, response: #selector(onGetBatteryInfo)) 

} 

func onGetBatteryInfo(scanObj: ISktScanObject) { 

    let result:SKTRESULT = scanObj.Msg().Result() 
    print("GetBatteryInfo status:\(result)") 

    if (result == ESKT_NOERROR) { 
     let batterylevel = scanObj.Property().getUlong() 
     print("Battery is:\(batterylevel)") 
    } else { 
     print("Error GetBatteryInfo status:\(result)") 
    } 

はしかし、私は戻って取得値は次のとおりです。

GetBatteryInfo status:0 

Battery is:1677741312 

私のコードが正しければ、その後どのように私はバッテリーを作るのですか結果私はパーセンテージのように意味のある結果を取り戻しますか?
もし私がオフになったら、バッテリーレベル、ファームウェアバージョンなどの情報を元に戻すにはどうすればいいですか?

おかげ

デビッド

答えて

2

EDITSKTBATTERY_GETCURLEVELはスウィフトではサポートされていません。しかしながら、docsは、バッテリレベル応答が、第1バイト、第2バイト、および第3バイトでそれぞれ符号化された最小、現在および最大レベルを含むことを説明している。

次は、ここで私が使用したコードですSKTBATTERY_GETCURLEVEL

スウィフト

func onGetBatteryInfo(scanObj: ISktScanObject) { 

    let result:SKTRESULT = scanObj.Msg().Result() 

    if(SKTSUCCESS(result)){ 

     let batteryInfo = scanObj.Property().getUlong(); 

     let batteryMin = ((batteryInfo >> 4) & 0xff); 
     let batteryCurrent = ((batteryInfo >> 8) & 0xff); 
     let batteryMax = ((batteryInfo >> 12) & 0xff); 

     let batteryPercentage = batteryCurrent/(batteryMax - batteryMin); 
     print("Battery is:\(batteryPercentage)") 

     self.setBatteryLevel = batteryPercentage 
     self.tableView.reloadData 

    } else { 

     print("Error GetBatteryInfo status:\(result)") 
    } 
} 

のObjective-C

-(void) onGetBatteryInfo:(ISktScanObject*)scanObj { 

SKTRESULT result=[[scanObj Msg]Result]; 
if(SKTSUCCESS(result)){ 

    long batteryLevel = SKTBATTERY_GETCURLEVEL([[scanObj Property] getUlong]); 
    NSLog(@"BatteryInfo %ld", batteryLevel); 

    [self setBatteryLevel:batteryLevel]; 
    [self.tableView reloadData]; 

} else { 

    NSLog(@"Error GetBatteryInfo status: %ld",result); 
} 
} 
+0

感謝を低下すると値がタイマーによって各120秒に更新され、このようにアクションが、それは私が考えたものを正確にですが、スウィフトで私の知る限り、それは知っている、発生する可能性がありますSKTBATTERY_GETCURLEVELについては何もないので、未解決のIDを使用するときはSKTBATTERY_GETCURLEVELを使用できません。それで、私はそれがうまくいくはずのドキュメントに従って固まってしまったのです! – Dave

+1

@Daveあなたが正しいので、即時バージョンに存在しない '#define'マクロであるため、' SKTBATTERY_GETCURLEVEL'のコードをインライン化するためにtymacの答えを編集しました – Enrico

+1

ありがとう@Enrico。私はObjective-Cから翻訳しました。実際に私はSocketScanのチケットを持っています。何か他のことについて質問する必要があります。 Daveのネイティブクラスメソッドを使用する場合は、単にObjective-C '拡張機能'を書くことができます。 Objective-Cを追加しました。エンリコのビットマスキングを使用すると、相当のパーセンテージを得ることができます:) – tymac

0

を使用するのと同じです。 appDelegateで定義された変数で、batteryPercentageの変数で、v値が必要なときに読み込まれます。レベルが答えのためなど

func onBatteryLevel (scanObj: ISktScanObject) { 
    let result: SKTRESULT = scanObj.Msg().Result() 
    if (SKTRESULT(result) > -1) { 
     let property: ISktScanProperty = scanObj.Property() 
     var batteryLevel = property.getUlong() 

     #if arch(x86_64) || arch(arm64) 
      batteryLevel = (batteryLevel<<(48))>>(56) 
      #else 
      batteryLevel = (batteryLevel<<(48-32))>>(56-32) 
     #endif 
     batteryPercentage = Int(batteryLevel) 
    } else { 
     debug ("data error \(result)") 
    } 
} 
関連する問題