Created
December 4, 2015 11:59
-
-
Save marcwan/eb3760cee286e7026594 to your computer and use it in GitHub Desktop.
A function to parse Eddystone TLM frames.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static let kEddystoneTLMFrameByteCount = 14; | |
static let EddystoneTLMFrameTypeID: UInt8 = 0x20 | |
private func parseTelemetryFrame(telemetryFrame : NSData) { | |
let count = telemetryFrame.length | |
if count == ThisClassName.kEddystoneTLMFrameByteCount { | |
var frameType: UInt8 = 0 | |
telemetryFrame.getBytes(&frameType, length: sizeof(UInt8)) | |
if frameType != ThisClassName.EddystoneTLMFrameTypeID { | |
NSLog("This is not a TLM frame") | |
return | |
} | |
var tlmVersion: Int8 = 0 | |
telemetryFrame.getBytes(&tlmVersion, range: NSMakeRange(1, sizeof(UInt8))) | |
if tlmVersion != 0 { | |
NSLog("Unknown TLM frame version") | |
return | |
} | |
var batteryVoltage: UInt16 = 0 | |
telemetryFrame.getBytes(&batteryVoltage, range: NSMakeRange(2, sizeof(UInt16))) | |
batteryVoltage = UInt16(bigEndian: batteryVoltage) | |
// This is in 8.8 fixed point. Just have to divide by 256 to get the actual number. | |
var beaconTemperatureFixed: Int8 = 0 | |
var beaconTemperatureFractional: UInt8 = 0 | |
telemetryFrame.getBytes(&beaconTemperatureFixed, range: NSMakeRange(4, sizeof(Int8))) | |
telemetryFrame.getBytes(&beaconTemperatureFractional, range: NSMakeRange(5, sizeof(UInt8))) | |
let beaconTemperature = Float(beaconTemperatureFixed) | |
+ Float(beaconTemperatureFractional) / 256.0 | |
var advertisingPDUCount: UInt32 = 0 | |
telemetryFrame.getBytes(&advertisingPDUCount, range: NSMakeRange(6, sizeof(UInt32))) | |
advertisingPDUCount = UInt32(bigEndian: advertisingPDUCount) | |
var timeOnSincePowerOn: UInt32 = 0 | |
telemetryFrame.getBytes(&timeOnSincePowerOn, range: NSMakeRange(10, sizeof(UInt32))) | |
timeOnSincePowerOn = UInt32(bigEndian: timeOnSincePowerOn) | |
NSLog("TLM Frame: voltage: %d temp: %f PDU count: %u time on: %u", | |
batteryVoltage, beaconTemperature, advertisingPDUCount, timeOnSincePowerOn) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment