#!   /usr/bin/env   python
#    coding: utf8

# Copyright CERN, 2011
# Author: Matthieu Cattin <matthieu.cattin@cern.ch>
# Licence: GPL v2 or later.
# Website: http://www.ohwr.org
# Last modifications: 16/5/2012

# Import system modules
import sys
import time
import datetime
import os

# Import specific modules
from fmc_adc_spec import *
from fmc_adc import *

# Import common modules
from ptsexcept import *
from fmc_eeprom import *
import rr


"""
test47: Read eeprom and check validity

Note: Requires test00.py to run first to load the gateware!
      Requires test23.py to run to write eeprom data.
"""

def main (default_directory='.'):

    # Constants declaration
    TEST_NB = 47
    EXPECTED_BITSTREAM_TYPE = 0x1

    EEPROM_SIZE = 8192 # in Bytes
    EEPROM_EXPECTED_CONTENT = [01, 00]


    start_test_time = time.time()
    print "================================================================================"
    print "Test%02d start\n" % TEST_NB

    # SPEC object declaration
    print "Loading hardware access library and opening device.\n"
    spec = rr.Gennum()

    # Carrier object declaration (SPEC board specific part)
    try:
        carrier = CFmcAdc100mSpec(spec, EXPECTED_BITSTREAM_TYPE)
    except FmcAdc100mSpecOperationError as e:
        raise PtsCritical("Carrier init failed, test stopped: %s" % e)

    # Mezzanine object declaration (FmcAdc100m14b4cha board specific part)
    try:
        fmc = CFmcAdc100m(spec)
    except FmcAdc100mOperationError as e:
        raise PtsCritical("Mezzanine init failed, test stopped: %s" % e)


    ###########################################################################
    # Real test stuff here
    try:

        # Read entire EEPROM
        print "Read EEPROM content."
        eeprom_data_read = fmc.sys_i2c_eeprom_read(0, EEPROM_SIZE)

        #==================================================
        # Check eeprom content validity
        print "Check EEPROM content validity.\n"
        mismatch = 0
        for i in range(len(EEPROM_EXPECTED_CONTENT)):
            expect_data = EEPROM_EXPECTED_CONTENT[i]
            rd_data = eeprom_data_read[i]
            if expect_data == rd_data:
                check = "OK"
            else:
                check = "FAILED"
                mismatch += 1
                #print "0x%02X 0x%02X => %s" % (expect_data, rd_data, check)
            print "0x%02X: 0x%02X == 0x%02X ? => %s" % (i, expect_data, rd_data, check)
        print "EEPROM content validity check => ",
        if(mismatch == 0):
            print "OK"
        else:
            print "FAILED"


    except FmcAdc100mOperationError as e:
        raise PtsError("Test failed: %s" % e)

    ###########################################################################

    print ""
    print "==> End of test%02d" % TEST_NB
    print "================================================================================"
    end_test_time = time.time()
    print "Test%02d elapsed time: %.2f seconds\n" % (TEST_NB, end_test_time-start_test_time)

    # Check if an error occurred during EEPROM verification
    if(mismatch != 0):
        raise PtsError("EEPROM validity check failed: %d mismatch found. Check log for details." % mismatch)


if __name__ == '__main__' :
    main()
