diff --git a/generate-defines.py b/generate-defines.py new file mode 100755 index 0000000..5acc08c --- /dev/null +++ b/generate-defines.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python +import json +import markdown +import unicodedata +import re +import os +import time +import sys + +pins = None + +key_template = { + 'python': '{board_name}_{name}', + 'ruby': '{board_name}_{name}', + 'spin': ' {board_name}_{name}', + 'c': '#define {board_name}_{name}' +} + +value_template = { + 'python': ' = {value}', + 'ruby': ' = {value}', + 'spin': ' = {value}', + 'c': ' {value}' +} + +comment_prefix = { + 'python': '#', + 'ruby': '', + 'spin': '\'', + 'c': '//' +} + +def slugify(value): + """ + Normalizes string, converts to lowercase, removes non-alpha characters, + and converts spaces to hyphens. + """ + value = unicode(value) + value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii') + value = value.replace('+','PLUS') + value = value.replace('-','MINUS') + value = re.sub('[^\w\s-]', '', value).strip().lower() + return re.sub('[-\s]+', '_', value) + +def bcm_to_physical(pin): + pin = pin[3:] + for idx in pins: + compare_pin = pins[idx] + if 'scheme' in compare_pin: + if 'bcm' in compare_pin['scheme']: + if compare_pin['scheme']['bcm'] == int(pin): + print("Mapping BCM{} to {}".format(pin, str(idx))) + return str(idx) + +def physical_to_bcm(pin): + pin = pins[pin] + if 'scheme' in pin: + if 'bcm' in pin['scheme']: + return str(pin['scheme']['bcm']) + return None + +def physical_to_wiringpi(pin): + pin = pins[pin] + if 'scheme' in pin: + if 'wiringpi' in pin['scheme']: + return str(pin['scheme']['wiringpi']) + return None + +def physical_to(pin, scheme='bcm'): + if scheme in ['bcm','wiringpi']: + pin = pins[pin] + if 'scheme' in pin: + if scheme in pin['scheme']: + return str(pin['scheme'][scheme]) + elif scheme == 'physical': + return pin + return None + +db = json.load(open('pi-pinout.json')) +pins = db['pins'] + +define = {} +keys = [] + +def add_define(key, value): + global keys, define + keys.append(key) + define[key] = value + +if len(sys.argv) >= 3: + + overlay_file = sys.argv[1] + pin_scheme = sys.argv[2] + output_lang = sys.argv[3] + + overlay = json.load(open('overlay/{}.json'.format(overlay_file))) + + if 'i2c' in overlay: + for addr in overlay['i2c']: + info = overlay['i2c'][addr] + + add_define('ADDR_' + slugify(info['name']).upper(), addr) + + if 'pin' in overlay: + for pin in overlay['pin']: + info = overlay['pin'][pin] + if str(pin).startswith('bcm'): + pin = bcm_to_physical(pin) + + + if 'name' in info: + name = slugify(info['name']).upper() + else: + name = slugify(pins[pin]['name']).upper() + + add_define(name, physical_to(pin, pin_scheme)) + + board_name = slugify(overlay['name']).upper() + + print(comment_prefix[output_lang] + ' Pin definitions for ' + overlay['name']) + print(comment_prefix[output_lang] + ' Using the {} pin numbering scheme'.format(pin_scheme)) + + row_length = 0 + + for name in define: + key = key_template[output_lang].format( + board_name = board_name, + name = name + ) + row_length = max(len(key),row_length) + + + for name in keys: + key = key_template[output_lang].format( + board_name = board_name, + name = name + ) + + value = value_template[output_lang].format(value = define[name]) + + value = value.rjust(row_length - len(key) + len(value),' ') + + print(key+value) diff --git a/overlay/explorer-hat-pro.json b/overlay/explorer-hat-pro.json index 658b2e3..47b740c 100644 --- a/overlay/explorer-hat-pro.json +++ b/overlay/explorer-hat-pro.json @@ -6,7 +6,26 @@ "buy": "http://shop.pimoroni.com/products/explorer-hat", "description": "An all-in-one light, input, motor, touch and output add-on board.", "pincount": 40, + "i2c": { + "0x28": { + "name": "Cap Touch", + "device": "cap1208" + }, + "0x48": { + "name": "Analog Input", + "device": "ads1015" + } + }, "pin": { + "3": {}, + "5": {}, + "8": {}, + "10": {}, + "12": {}, + "19": {}, + "21": {}, + "23": {}, + "24": {}, "7": { "name": "LED 1", "mode": "output",