"""Omnivision OVD file to C header file converter."""
__author__ = "Daniel Casner <daniel@anki.com>"

import sys, os, time

usage = """
%s <INPUT OVD FILE> <STARTING LINE NUMBER> <OUTPUT HEADER FILE>
""" % sys.argv[0]

def parseOVD(ovdFileName, startLineNo):
    fh = open(ovdFileName, 'rb')
    for i in range(startLineNo-1):
        fh.readline() # Throw away the lines we don't care about
    parsed = []
    while True:
        line = fh.readline()
        print(line)
        if len(line) < 10:
            break
        else:
            parsed.append((int(line[3:7], 16), int(line[8:10], 16)))
    return parsed

def writeH(ovdFileName, startLineNo, headerFileName, includeStructDef=False):
    data = parseOVD(ovdFileName, startLineNo)
    fh = open(headerFileName, 'w')
    fh.write("""/********************************************************************************
HEADER FILE GENERATED BY %s at %s
From OVD file %s starting at line %d
********************************************************************************/

""" % (sys.argv[0], time.ctime(), ovdFileName, startLineNo))
    if includeStructDef:
        fh.write("""
struct OVRegSettings
{
  u16 reg;
  u8  val;
  u8  mask;
};

struct OVRegScript
{
  u32 len;
  OVRegSettings* script;
};
""")
    fh.write("""
static struct OVRegSettings REG_SCRIPT_DATA[%d] = {
""" % (len(data),))
    for reg in data:
        fh.write("  { 0x%04x, 0x%02x, 0xff },\n" % reg)
    fh.write("""};

static struct OVRegScript REG_SCRIPT = { %d, REG_SCRIPT_DATA };
""" % len(data))
    fh.close()

if __name__ == '__main__':
    try:
        inOVD = sys.argv[1]
        assert os.path.isfile(inOVD)
        lineNo = int(eval(sys.argv[2]))
        outH = sys.argv[3]
    except:
        sys.stderr.write(usage)
    else:
        writeH(inOVD, lineNo, outH)
