Yet Another WebIOPi+
 All Classes Namespaces Files Functions Variables Macros Pages
manager.py
Go to the documentation of this file.
1 import imp
2 from webiopi.utils import logger
3 from webiopi.utils import types
4 from webiopi.devices.instance import DEVICES
5 
6 from webiopi.devices import serial, digital, analog, sensor, shield, clock, memory
7 
8 PACKAGES = [serial, digital, analog, sensor, shield, clock, memory]
9 def findDeviceClass(name):
10  for package in PACKAGES:
11  if hasattr(package, name):
12  return getattr(package, name)
13  if hasattr(package, "DRIVERS"):
14  for driver in package.DRIVERS:
15  if name in package.DRIVERS[driver]:
16  (fp, pathname, stuff) = imp.find_module(package.__name__.replace(".", "/") + "/" + driver)
17  module = imp.load_module(driver, fp, pathname, stuff)
18  return getattr(module, name)
19  return None
20 
21 def addDevice(name, device, args):
22  devClass = findDeviceClass(device)
23  if devClass == None:
24  raise Exception("Device driver not found for %s" % device)
25  if len(args) > 0:
26  dev = devClass(**args)
27  else:
28  dev = devClass()
29  addDeviceInstance(name, dev, args)
30 
31 def addDeviceInstance(name, dev, args):
32  funcs = {"GET": {}, "POST": {}}
33  for att in dir(dev):
34  func = getattr(dev, att)
35  if callable(func) and hasattr(func, "routed"):
36  if name == "GPIO":
37  logger.debug("Mapping %s.%s to REST %s /GPIO/%s" % (dev, att, func.method, func.path))
38  else:
39  logger.debug("Mapping %s.%s to REST %s /devices/%s/%s" % (dev, att, func.method, name, func.path))
40  funcs[func.method][func.path] = func
41 
42  DEVICES[name] = {'device': dev, 'functions': funcs}
43  if name == "GPIO":
44  logger.info("GPIO - Native mapped to REST API /GPIO")
45  else:
46  logger.info("%s - %s mapped to REST API /devices/%s" % (dev.__family__(), dev, name))
47 
49  devices = [k for k in DEVICES.keys()]
50  for name in devices:
51  device = DEVICES[name]["device"]
52  logger.debug("Closing device %s - %s" % (name, device))
53  del DEVICES[name]
54  device.close()
55 
56 def getDevicesJSON(compact=False):
57  devname = "name"
58  devtype = "type"
59 
60  devices = []
61  for devName in DEVICES:
62  if devName == "GPIO":
63  continue
64  instance = DEVICES[devName]["device"]
65  if hasattr(instance, "__family__"):
66  family = instance.__family__()
67  if isinstance(family, str):
68  devices.append({devname: devName, devtype:family})
69  else:
70  for fam in family:
71  devices.append({devname: devName, devtype:fam})
72 
73  else:
74  devices.append({devname: devName, type:instance.__str__()})
75 
76  return types.jsonDumps(sorted(devices, key=lambda dev: dev[devname]))
77