from __future__ import unicode_literals
[docs]class BTCoD:
"""
Bluetooth class of device decoder for providing
a human readable form of the device class value.
The class of device is a 24-bit number allowing different
types of bluetooth devices to be described consistently
and succinctly using a hierarchical scheme.
* **Major Service**: The major services that the
device supports. Several values can be OR'd together
to form a device supporting multiple major services
e.g., telephony, networking and audio could be
the combined service set for a device.
* **Major Device**: The form-factor or major type of device
which may only take a single value e.g., Laptop,
Toy, Health Device, Phone, etc.
* **Minor Device**: The minor function of the device whose
range of values depends on the major function e.g.,
Car audio, SmartPhone, etc.
:param integer cod: 24-bit integer value representing the
class of device.
.. note:: The class of device may be obtained from both
the :py:class:`.BTAdapter` and :py:class:`.BTDevice`
classes using the `Class` attribute.
"""
_MAJOR_SERVICE_POS = 13
_MAJOR_SERVICE_MASK = 0xFFE000
_MAJOR_SERVICE_CLASS = {
0x002000: 'Limited Discoverable Mode [Ref #1]',
0x004000: '(reserved)',
0x008000: '(reserved)',
0x010000: 'Positioning (Location identification)',
0x020000: 'Networking (LAN, Ad hoc, ...)',
0x040000: 'Rendering (Printing, Speakers, ...)',
0x080000: 'Capturing (Scanner, Microphone, ...)',
0x100000: 'Object Transfer (v-Inbox, v-Folder, ...)',
0x200000: 'Audio (Speaker, Microphone, Headset service, ...)',
0x400000: 'Telephony (Cordless telephony, Modem, Headset service, ...)', # noqa
0x800000: 'Information (WEB-server, WAP-server, ...)',
}
_MAJOR_DEVICE_POS = 8
_MAJOR_DEVICE_MASK = 0x001F00
_MAJOR_DEVICE_CLASS = {
0x0000: 'Miscellaneous [Ref #2]',
0x0100: 'Computer (desktop, notebook, PDA, organizer, ... )',
0x0200: 'Phone (cellular, cordless, pay phone, modem, ...)',
0x0300: 'LAN /Network Access point',
0x0400: 'Audio/Video (headset, speaker, stereo, video display, VCR, ...', # noqa
0x0500: 'Peripheral (mouse, joystick, keyboard, ... ',
0x0600: 'Imaging (printer, scanner, camera, display, ...)',
0x0700: 'Wearable',
0x0800: 'Toy',
0x0900: 'Health',
0x1F00: 'Uncategorized: device code not specified'
}
_MINOR_DEVICE_CLASS = {
0x0100: [{'mask': 0x1C, 'pos': 2,
0x00: 'Uncategorized, code for device not assigned',
0x04: 'Desktop workstation',
0x08: 'Server-class computer',
0x0C: 'Laptop',
0x10: 'Handheld PC/PDA (clamshell)',
0x14: 'Palm-size PC/PDA',
0x18: 'Wearable computer (watch size)',
0x1C: 'Tablet'}],
0x0200: [{'mask': 0x1C, 'pos': 2,
0x00: 'Uncategorized, code for device not assigned',
0x04: 'Cellular',
0x08: 'Cordless',
0x0C: 'Smartphone',
0x10: 'Wired modem or voice gateway',
0x14: 'Common ISDN access'}],
0x0300: [{'mask': 0xE0, 'pos': 5,
0x00: 'Fully available',
0x20: '1% to 17% utilized',
0x40: '17% to 33% utilized',
0x60: '33% to 50% utilized',
0x80: '50% to 67% utilized',
0xA0: '67% to 83% utilized',
0xC0: '83% to 99% utilized',
0xE0: 'No service available'}],
0x0400: [{'mask': 0x7C, 'pos': 2,
0x00: 'Uncategorized, code not assigned',
0x04: 'Wearable Headset Device',
0x08: 'Hands-free Device',
0x0C: '(Reserved)',
0x10: 'Microphone',
0x14: 'Loudspeaker',
0x18: 'Headphones',
0x1C: 'Portable Audio',
0x20: 'Car audio',
0x24: 'Set-top box',
0x28: 'HiFi Audio Device',
0x2C: 'VCR',
0x30: 'Video Camera',
0x34: 'Camcorder',
0x38: 'Video Monitor',
0x3C: 'Video Display and Loudspeaker',
0x40: 'Video Conferencing',
0x44: '(Reserved)',
0x48: 'Gaming/Toy'}],
0x0500: [{'mask': 0xC0, 'pos': 6,
0x00: 'Not Keyboard / Not Pointing Device',
0x40: 'Keyboard',
0x80: 'Pointing device',
0xC0: 'Combo keyboard/pointing device'},
{'mask': 0x3C, 'pos': 2,
0x00: 'Uncategorized device',
0x04: 'Joystick',
0x08: 'Gamepad',
0x0C: 'Remote control',
0x10: 'Sensing device',
0x14: 'Digitizer tablet',
0x18: 'Card Reader (e.g. SIM Card Reader)',
0x1C: 'Digital Pen',
0x20: 'Handheld scanner for bar-codes, RFID, etc.',
0x24: 'Handheld gestural input device (e.g., "wand" form factor)'}], # noqa
0x0600: [{'mask': 0xF0, 'pos': 4,
0x10: 'Display',
0x20: 'Camera',
0x40: 'Scanner',
0x80: 'Printer'}],
0x0700: [{'mask': 0x1C, 'pos': 2,
0x04: 'Wristwatch',
0x08: 'Pager',
0x0C: 'Jacket',
0x10: 'Helmet',
0x14: 'Glasses'}],
0x0800: [{'mask': 0x1C, 'pos': 2,
0x04: 'Robot',
0x08: 'Vehicle',
0x0C: 'Doll / Action figure',
0x10: 'Controller',
0x14: 'Game'}],
0x0900: [{'mask': 0x3C, 'pos': 2,
0x00: 'Undefined',
0x04: 'Blood Pressure Monitor',
0x08: 'Thermometer',
0x0C: 'Weighing Scale',
0x10: 'Glucose Meter',
0x14: 'Pulse Oximeter',
0x18: 'Heart/Pulse Rate Monitor',
0x1C: 'Health Data Display',
0x20: 'Step Counter',
0x24: 'Body Composition Analyzer',
0x28: 'Peak Flow Monitor',
0x2C: 'Medication Monitor',
0x30: 'Knee Prosthesis',
0x34: 'Ankle Prosthesis',
0x38: 'Generic Health Manager',
0x3C: 'Personal Mobility Device'}]
}
def __init__(self, cod):
self.cod = cod
@property
[docs] def major_service_class(self):
"""
Return the major service class property decoded e.g.,
Audio, Telephony, etc
"""
major_service = []
for i in BTCoD._MAJOR_SERVICE_CLASS.keys():
if (self.cod & i):
major_service.append(BTCoD._MAJOR_SERVICE_CLASS[i])
return major_service
@property
[docs] def major_device_class(self):
"""
Return the major device class property decoded e.g.,
Computer, Audio/Video, Toy, etc.
"""
return BTCoD._MAJOR_DEVICE_CLASS.get(self.cod &
BTCoD._MAJOR_DEVICE_MASK,
'Unknown')
@property
[docs] def minor_device_class(self):
"""
Return the minor device class property decoded e.g.,
Scanner, Printer, Loudspeaker, Camera, etc.
"""
minor_device = []
minor_lookup = BTCoD._MINOR_DEVICE_CLASS.get(self.cod &
BTCoD._MAJOR_DEVICE_MASK,
[])
for i in minor_lookup:
minor_value = self.cod & i.get('mask')
minor_device.append(i.get(minor_value, 'Unknown'))
return minor_device
def __str__(self):
"""Stringify all elements of the class of device"""
return '<cod:' + str(hex(self.cod)) + ' Major Service:' + str(self.major_service_class) + \
' Major Device:' + \
self.major_device_class + ' Minor Device:' + \
str(self.minor_device_class) + '>'
def __repr__(self):
return self.__str__()