#!/usr/bin/python # This file is part of Espruino, a JavaScript interpreter for Microcontrollers # # Copyright (C) 2013 Gordon Williams # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # # ---------------------------------------------------------------------------------------- # Builds HTML documentation from the files in the boards directory # ---------------------------------------------------------------------------------------- import subprocess; import re; import json; import sys; import os; import importlib; scriptdir = os.path.dirname(os.path.realpath(__file__)) basedir = scriptdir+"/../" sys.path.append(basedir+"scripts"); sys.path.append(basedir+"boards"); import pinutils; # ----------------------------------------------------------------------------------------- # Now scan AF file print("Script location "+scriptdir) embeddable = False boardname = "" if len(sys.argv)==3 and sys.argv[2]=="pinout": embeddable = True boardname = sys.argv[1] if len(sys.argv)==2: boardname = sys.argv[1] if boardname=="": print("ERROR...") print("USAGE: build_board_docs.py BOARD_NAME [pinout]") print(" 'pinout' will output embeddable HTML of just the pinout") exit(1) print("BOARD "+boardname) #htmlFilename = sys.argv[2] htmlFilename = "boards/"+boardname+".html" print("HTML_FILENAME "+htmlFilename) htmlFile = open(htmlFilename, 'w') def writeHTML(s): htmlFile.write(s+"\n"); # import the board def board = importlib.import_module(boardname) # Call the included board_specific file - it sets up 'pins' and 'fill_gaps' pins = board.get_pins() pins = pinutils.append_devices_to_pin_list(pins, board) #if not embeddable and "link" in board.info and board.info["link"][0].startswith("http://www.espruino.com"): # writeHTML('Please wait. redirecting...'); # exit(0); # ----------------------------------------------------------------------------------------- functionsOnBoard = []; for pin in pins: if pin["name"][0] == 'P': pin["name"] = pin["name"][1:]; for func in pin["functions"]: if func in pinutils.CLASSES: if not pinutils.CLASSES[func] in functionsOnBoard: functionsOnBoard.append(pinutils.CLASSES[func]) #print(json.dumps(functionsOnBoard)) def has_pinb(brd,pin): for pinstrip in brd: if pinstrip[0]!='_': for p in brd[pinstrip]: if p==pin: return True return False def has_pin(pin): if hasattr(board, 'boards'): for brdnum in range(len(board.boards)): if has_pinb(board.boards[brdnum], pin): return True return False else: return has_pinb(board.board, pin) # ----------------------------------------------------------------------------------------- def dump_pin(brd, pin, pinstrip): pinmap = {}; if '_pinmap' in brd: pinmap = brd['_pinmap']; if pin in pinmap: pin = pinmap[pin]; pininfo = pinutils.findpin(pins, pin, False) not_five_volt = False # print(json.dumps(pininfo)) if ("csv" in pininfo) and ("IO" in pininfo["csv"]) and ("Type" in pininfo["csv"]) and (pininfo["csv"]["Type"]=="I/O") and (pininfo["csv"]["IO"]!="FT") : not_five_volt = True if "3.3" in pininfo["functions"]: not_five_volt = True writeHTML('
'); pinHTML = '' if pin!="": pinHTML = ' '+pin+""; pinHTML2 = ''; if not_five_volt: pinHTML2 += '3.3v\n'; if ("_notes" in brd) and (pin in brd["_notes"]): pinHTML2 += '!\n'; reverse = pinstrip=="left" or pinstrip=="right2"; if not reverse: writeHTML(pinHTML+"\n"+pinHTML2) pinfuncs = {} for func in sorted(pininfo["functions"]): # writeHTML(' '+func) if func in pinutils.CLASSES: funcdata = str(pininfo["functions"][func]) cls = pinutils.CLASSES[func] name = cls title = func if cls=="I2C" or cls=="SPI" or cls=="USART": name=func.replace("_"," ") if cls=="DEVICE" and funcdata[:4]=="pin_": title = title + " ("+funcdata[4:]+")"; # print title if func in pinutils.NAMES: name = pinutils.NAMES[func] writeHTML('') if name in pinfuncs: pinfuncs[name]["title"] = pinfuncs[name]["title"] + " " + title else: pinfuncs[name] = { 'cls': cls, 'title': "["+pin+"] "+title, 'name': name, 'id': pin+"_"+func, 'func' : func }; for func in sorted(pinfuncs.items(),key=lambda x: x[1]['cls']): pf = func[1] url = False if pf["cls"] in pinutils.URLS: url = pinutils.URLS[pf["cls"]] if pf["func"] in pinutils.URLS: url = pinutils.URLS[pf["func"]] if url != False: writeHTML(' '); writeHTML(' '+pf["name"]+'') if url != False: writeHTML(' '); writeHTML(' ') if reverse: writeHTML(pinHTML2+"\n"+pinHTML) writeHTML('
') if not embeddable: writeHTML(""" """); writeHTML(""" "+'') writeHTML(""" """) if not embeddable: writeHTML(" ") writeHTML(" ") writeHTML('

'+board.info["name"]+'

') writeHTML(' ') if "link" in board.info: for link in board.info["link"]: writeHTML('

'+link+'

') writeHTML('

Specifications

') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML(' ') writeHTML('
Chip'+board.chip['part']+'
Package'+board.chip['package']+'
RAM'+str(board.chip['ram'])+' kBytes
Flash'+str(board.chip['flash'])+' kBytes
Speed'+str(board.chip['speed'])+' Mhz
USARTs'+str(board.chip['usart'])+'
SPIs'+str(board.chip['spi'])+'
I2Cs'+str(board.chip['i2c'])+'
USB'+("Yes" if "USB" in board.devices else "No")+'
DACs'+(str(board.chip['dac']) if board.chip['dac']>0 else "No")+'
SD Card'+("Yes" if "SD" in board.devices else "No")+'
') writeHTML('

Like this? Please tell your friends, blog, or support us by buying our board!

') writeHTML('

Pinout

') writeHTML("""

Hover the mouse over a pin function for more information. Clicking in a function will tell you how to use it in Espruino.

"); def writeBoard(brd, brdnum): boardname = "board" if brdnum!=0: boardname += str(brdnum+1) writeHTML(' ') writeHTML('
') writeHTML('
') usedpins = [] for pinstrip in brd: if pinstrip[0]!='_': writeHTML('
') for pin in brd[pinstrip]: usedpins.append(pin) dump_pin(brd, pin, pinstrip) writeHTML('
') otherpins=0 for pinstruct in pins: pin = pinstruct["name"] if not pin in usedpins: otherpins = otherpins + 1 writeHTML('
') writeHTML('
') if otherpins>0 and not ('_hide_not_on_connectors' in brd and brd["_hide_not_on_connectors"]): writeHTML('
') writeHTML('

Pins not on connectors

') for pinstruct in pins: pin = pinstruct["name"] if not pin in usedpins: dump_pin(brd, pin, "otherpins") writeHTML('
') writeHTML('

') if hasattr(board, 'boards'): for brdnum in range(len(board.boards)): writeBoard(board.boards[brdnum], brdnum) else: writeBoard(board.board, 0) #writeHTML(''); if not embeddable: writeHTML(" ") writeHTML("")