#!/usr/bin/env python
'''
create additional functions ADC table, used for mapping analog pins to ADC channel numbers

Currently only extracts ADC1 channels

This assumes a csv file extracted from the datasheet using tablula:

 https://github.com/tabulapdf/tabula
'''

import sys, csv, os

def is_pin(str):
    '''see if a string is a valid pin name'''
    if len(str) < 3:
        return False
    if str[0] != 'P':
        return False
    if str[1] not in "ABCDEFGH":
        return False
    try:
        p = int(str[2:])
        if p < 0 or p > 15:
            return False
        return True
    except ValueError:
        return False

def parse_adc_table(fname, table):
    csvt = csv.reader(open(fname,'rb'))
    i = 0
    for row in csvt:
        for col in row:
            if is_pin(col) and row[-1].startswith('ADC1'):
                chan = row[-1]
                chan = chan.replace('\r', '')
                chan = chan.replace(' ', '')
                chan = chan.split('/')
                chan = chan[0]
                chan = chan.split(',')
                chan = chan[0]
                a = chan.split('_')
                if len(a) != 2:
                    continue
                chan_num = a[1]
                if chan_num.startswith('IN'):
                    chan_num = chan_num[2:]
                try:
                    chan_num = int(chan_num)
                except Exception:
                    continue
                table[col] = chan_num

table = {}

if len(sys.argv) != 2:
    print("Error: expected 1 CSV file")
    sys.exit(1)

parse_adc_table(sys.argv[1], table)

sys.stdout.write("ADC1_map = {\n");
sys.stdout.write('\t# format is PIN : ADC1_CHAN\n')
sys.stdout.write('\t# extracted from %s\n' % os.path.basename(sys.argv[1]))
for k in sorted(table.keys()):
    s = '"' + k + '"'
    sys.stdout.write('\t%-4s\t:\t%s,\n' % (s, table[k]))
sys.stdout.write("}\n");
