#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Tests specific for the firmware.

Check that register values are correct after starting an exposure

0x4 exposure time
0x5 period
0x6 sub exposure time

"""
import pytest
import config_test
from fixtures import detector, eiger, jungfrau, eigertest, jungfrautest
from sls_detector.errors import DetectorValueError
from sls_detector.utils import  eiger_register_to_time

# testdata_exptimes = [0.001, 0.002, 0.0236]

@eigertest
def test_short_exposure_time(eiger):
    t = 1.23
    eiger.exposure_time = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    #Register 0x4 holds exposure time
    reg = eiger.register[0x4]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)

@eigertest
def test_short_minimal_exposure_time(eiger):
    t = 1e-8
    eiger.exposure_time = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    #Register 0x4 holds exposure time
    reg = eiger.register[0x4]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)


@eigertest
def test_long_exposure_time(eiger):
    t = 623
    eiger.exposure_time = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x4 holds exposure time
    reg = eiger.register[0x4]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)


@eigertest
def test_short_period(eiger):
    t = 0.1
    eiger.exposure_time = 0.001
    eiger.period = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x5 holds period
    reg = eiger.register[0x5]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)


@eigertest
def test_long_period(eiger):
    t = 8900
    eiger.exposure_time = 0.001
    eiger.period = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x5 holds period
    reg = eiger.register[0x5]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)

@eigertest
def test_zero_period_with_acq(eiger):
    t = 0
    eiger.exposure_time = 0.001
    eiger.period = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x5 holds period
    reg = eiger.register[0x5]
    assert pytest.approx(t, 1e-9) == eiger_register_to_time(reg)


testdata_times = [0.001, 0.002, 0.0236]
@eigertest
@pytest.mark.parametrize("t", testdata_times)
def test_subexptime(eiger,t):
    eiger.sub_exposure_time = t
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x6 holds sub exposure time
    # time is stored straight as n clocks
    reg = eiger.register[0x6]
    assert pytest.approx(t, 1e-9) == reg/100e6


@eigertest
@pytest.mark.parametrize("t", testdata_times)
def test_subdeadtime(eiger, t):
    eiger.sub_deadtime = t
    eiger.sub_exposure_time = 1
    eiger.sub_exposure_time = 0.001
    eiger.file_write = False
    eiger.start_detector()
    eiger.stop_detector()

    # Register 0x7 holds sub period
    # time is stored straight as n clocks
    # exptime+deadtime
    reg = eiger.register[0x7]
    assert pytest.approx(t, 1e-7) == (reg/100e6-0.001)