Source code for grove.helper.helper

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# The MIT License (MIT)
# Copyright (C) 2018  Seeed Technology Co.,Ltd.
#
# This is the library for Grove Base Hat
# which used to connect grove sensors for Raspberry Pi.
'''
This is Helper Classes

'''
from __future__ import print_function
from grove.adc import *
import time
import sys
import os
import re
import io

_SlotsGPIORpi     = { 5:"D5", 12:"PWM", 16:"D16", 18:"D18", 22:"D22", 24:"D24", 26:"D26" }
_SlotsGPIORpiZero = { 5:"D5", 12:"PWM", 16:"D16"           }
_SlotsADCRpi      = { 0:"A0",  2:"A2",   4:"A4",   6:"A6"  }
_SlotsADCRpiZero  = { 0:"A0",  2:"A2",   4:"A4"            }
_SlotsPWMRpi      = {         12:"PWM",           18:"D18" }
_SlotsPWMRpiZero  = {         12:"PWM"                     }
_SlotsNull        = { }

__all__ = ['SlotHelper', 'OverlayHelper']

[docs] class SlotHelper(object): # Slot types GPIO = 0 ADC = 1 PWM = 2 I2C = 3 UART = 4 # Platform types PLATFORM_UNKOWN = 0 PLATFORM_RPI = 1 PLATFORM_RPI_ZERO = 2 PLATFORM_CORAL = 3 PLATFORM_JETSON_NANO = 4 def __init__(self, slot = GPIO): adc = ADC() self.name = adc.name print("Hat Name = '{}'".format(self.name)) self.plat = self.get_platform() if self.name == RPI_ZERO_HAT_NAME: self.__hat_type = RPI_ZERO_HAT_PID self.__slots_gpio = _SlotsGPIORpiZero self.__slots_adc = _SlotsADCRpiZero self.__slots_pwm = _SlotsPWMRpiZero else: if self.name != RPI_HAT_NAME: print("Unknown hat, assume {}".format(RPI_HAT_NAME)) self.__hat_type = RPI_HAT_PID self.__slots_gpio = _SlotsGPIORpi self.__slots_adc = _SlotsADCRpi self.__slots_pwm = _SlotsPWMRpi self.__slots_i2c = _SlotsNull # fix support for specific platform if self.plat == self.PLATFORM_CORAL: self.__slots_gpio.pop(12) self.__slots_gpio.pop(18) self.__slots_gpio.pop(22) self.__slots_pwm.pop(18) self.__slots_pwm[22] = 'D22' maps = { \ SlotHelper.GPIO:self.__slots_gpio, \ SlotHelper.ADC :self.__slots_adc, \ SlotHelper.PWM :self.__slots_pwm, \ SlotHelper.I2C :self.__slots_i2c, \ } self._slots = maps.get(slot) self._slot = slot def is_adapted(self, pin): if not self._slots: return False if not pin in self._slots.keys(): return False return True def list_avail(self): if not self._slots: return maps = { \ SlotHelper.GPIO: "GPIO", \ SlotHelper.ADC : "ADC", \ SlotHelper.PWM : "PWM", \ SlotHelper.I2C : "I2C", \ } print(" <pin> could be one of below values") print(" in the pin column for {} function".format(maps.get(self._slot))) print(" And connect the device to corresponding slot") print("==============") print(" pin | slot") print("==============") for pin, slot in self._slots.items(): print('{:^5}|{:^5} '.format(pin, slot)) def argv2pin(self, extra=''): if len(sys.argv) < 2: usage = 'Usage: {} <pin>'.format(sys.argv[0]) usage += extra print(usage) self.list_avail() sys.exit(1) pin = int(sys.argv[1]) if not self.is_adapted(pin): self.list_avail() sys.exit(1) return pin def get_platform(self): plat = self.PLATFORM_UNKOWN model = io.open("/proc/device-tree/model").read().strip() if re.match(r"^Raspberry Pi.*", model) is not None: plat = self.PLATFORM_RPI_ZERO if self.name == RPI_ZERO_HAT_NAME else self.PLATFORM_RPI elif re.match(r"^Freescale i.MX8MQ Phanbell.*", model) is not None: plat = self.PLATFORM_CORAL return plat
def root_check(): if os.geteuid() != 0: print("This program must be run as root.") print("sudo required for non-root user, Aborting.") sys.exit(1) def __module_installed(name): for line in os.popen("lsmod"): match = re.match("^" + name + " *", line) if match is None: continue # print("result = {}".format(match)) return True return False def module_install(name, param): if __module_installed(name): return True os.system("modprobe " + name + " " + param) for _ in range(20): if __module_installed(name): return True time.sleep(0.2) return False
[docs] class OverlayHelper(object): def __init__(self, dev_path, overlay, param): self._path = dev_path self._ovlay = overlay self._param = param def __is_dt_inst(self): for line in os.popen("dtoverlay -l"): # lines likes #2: w1-gpio gpiopin=5 match = re.match("^[0-9]+: *" + self._ovlay + " +", line) if match is None: continue return True return False def is_installed(self): if os.path.exists(self._path): return True if self.__is_dt_inst(): return True return False def install(self): if self.is_installed(): return True os.system("dtoverlay " + self._ovlay + " " + self._param) for _ in range(20): if self.is_installed(): return True time.sleep(0.2) return False def __str__(self): return "Overlay {} installed = {}".format( self._ovlay, self.is_installed()) # __repr__ = __str__ @property def name(self): return self._ovlay
if __name__ == '__main__': helper = SlotHelper(SlotHelper.PWM) helper.list_avail() print("platform = {}".format(helper.plat)) sys.exit(0) print("module w1_therm installed: {}" .format(__module_installed("w1_therm"))) module_install("w1_therm", "") print("module w1_therm installed: {}" .format(__module_installed("w1_therm"))) print("module w1_gpio installed: {}" .format(__module_installed("w1_gpio"))) oh = OverlayHelper("/sys/devices/w1_bus_master1", "w1-gpio", "gpiopin=5") print(oh) print("install {} ...".format(oh.name)) oh.install() print(oh)