from enum import Enum

reg_table = {'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pwm_duty': 0x0210,
             'pwm_duty_save': 0x0220, 'pwm_per': 0x0230, 'pwm_per_save': 0x0240,
             'rtc_sinhro': 0x0804, 'log_info': 0x0900, 'log_ent': 0x0901, 
             'arch_cap': 0x0902, 'arch_ent': 0x0903, 'archive_per': 0x0904}


DIO_REGS = {'load_bits': 0x0130, 'cred_bits': 0x0131, 'out_cur': 0x0200}


LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}


class DioReg(Enum):

    IN_STATE        = 0x0100 # Состояние входов (вкл./выкл.)
    IN_BITS         = 0x0101 # Текущее состояние входов
    IN_CNT          = 0x0102 # Счетчики импульсов
    IN_MODE         = 0x0120 # Режим работы входов (битовое поле)
    IN_NORM         = 0x0122 # Нормальное состояние входов
    IN_DEBOUNCE     = 0x0124 # Время антидребезга (ms)

    LOAD_ERR        = 0x0130 # Состояние датчиков обрыва нагрузки (битовое поле)
    OUT_ERR         = 0x0131 # Неисправность реле (битовое поле)

    OUT_STATE       = 0x0200 # Состояние выходов (вкл./выкл.)
    OUT_STATE_SAVE  = 0x0201 # Состояние выходов в безопасном режиме (вкл./выкл.)
    OUT_BITS        = 0x0202 # Текущее состояние выходов
    OUT_BITS_SAVE   = 0x0203 # Состояние выходов в безопасном режиме
    OUT_MODE        = 0x0204 # Режим работы выходов (битовое поле)
    OUT_MODE_SAVE   = 0x0205 # Режим работы выходов в безопасном режиме (битовое поле) 




class AiReg(Enum):

    IN_STATE        = 0x0300 # Состояние входов (вкл./выкл.)
    IN_MODE         = 0x0301 # Режим работы входов (битовое поле)
    IN_VOL_RANGE    = 0X0302 # Диапазон измерения напряжения
    IN_CUR_RANGE    = 0x0303 # Диапазон измерения тока

    IN_FAILURE      = 0x0304 # Аварии аналоговых входов (битовое поле)

    EXT_SENS_POWER  = 0x0305 # Питание внешних датчиков

    IN_GAINE_FACTOR = 0x0310 # Коэффициент усиления канала
    IN_K_FACTOR     = 0x0320 # Коэффициент пересчета K
    IN_B_FACTOR     = 0x0340 # Коэффициент пересчета B
    IN_RAW          = 0x0360 # Канал AN_INP_1 (сырые данные)
    IN_FILTER       = 0x0380 # Фильтрованные данные с учетом K и B

    PR_STATE        = 0X03B0 # Состояние уставок (вкл./выкл.)
    PR_MIN          = 0x03BA # Нижнее значение уставок
    PR_MAX          = 0x03D2 # Верхнее значение уставок
    PR_HIST         = 0x03EA # Значение гистерезиса



class AoReg(Enum):

    OUT_STATE       = 0x0500 # статус выходов
    OUT_STATE_SAVE  = 0x0501 # статус выходов (безопасный режим)
    OUT_MODE        = 0x0502 # режим работы выходов (напряжение/ток)
    OUT_MODE_SAVE   = 0x0503 # режим работы выходов (безопасный режим)

    OUT_POWER       = 0x0504 # питание выходных каналов

    OUT_VALUE       = 0x0510 # Значение на выходе    
    OUT_VALUE_SAVE  = 0x0520 # Значение на выходе (безопасный режим)   
    

class SysReg(Enum):

    '''Производственные настройки'''
    MODEL       = 0x0080 # Модель (числовой код)
    HW_REV      = 0x0081 # Ревизия платы
    PRODATE     = 0x0082 # Дата производтсва
    SN          = 0x0084 # Серийный номер
    FW_VER      = 0x0086 # Версия ПО
    TEST_STATUS = 0x008A # Статус тестирования

    PASSWORD    = 0x0090 # Пароль
    SAVE_SYS    = 0x0091 # Команда записи системных настроек

    '''Системные параметры'''
    COMMAND     = 0x0800 # Команды управления
    UPTIME      = 0x0801 # Uptime
    RTC         = 0x0803 # RTC
    BAT_VOLTAGE = 0x0807 # Напряжение на батарее RTC
    ERR         = 0x0809 # Состояние модуля
    INFO        = 0x080B # Текстовая строка (пользовательская информация)
    SAVE_MODE   = 0x081B # Безопасный режим работы (0-выкл, 1-вкл)
    SAVE_DELAY  = 0x081C # Время до перехода в безопасный режим

    '''Команды'''
    WDT_STOP    = 0x0014 # Отключить watchdog (программно) 


class Log(Enum):

    """Управление"""
    CMD             = 0x0800 # Регистр управления

    LOG_ENTRYS_MAX  = 0x0900 # Количество записей в журнале событий (возможное)
    LOG_ENTRYS_CNT  = 0x0901 # Количество записей в журнале (текущее)
    ARCH_ENTRYS_MAX = 0x0902 # Количество записей в (возможное для одного канала)

    ARCH_ENTRYS_CH1 = 0x0903 # Количество записей в архиве для канала 1
    ARCH_ENTRYS_CH2 = 0x0904 # Количество записей в архиве для канала 2
    ARCH_ENTRYS_CH3 = 0x0905 # Количество записей в архиве для канала 3
    ARCH_ENTRYS_CH4 = 0x0906 # Количество записей в архиве для канала 4
    ARCH_ENTRYS_CH5 = 0x0907 # Количество записей в архиве для канала 5
    ARCH_ENTRYS_CH6 = 0x0908 # Количество записей в архиве для канала 6
    ARCH_ENTRYS_CH7 = 0x0909 # Количество записей в архиве для канала 7
    ARCH_ENTRYS_CH8 = 0x090A # Количество записей в архиве для канала 8

    ARCH_ENTRYS_CH9 = 0x090B # Количество записей в архиве для канала 9
    ARCH_ENTRYS_CH10 = 0x090C # Количество записей в архиве для канала 10
    ARCH_ENTRYS_CH11 = 0x090D # Количество записей в архиве для канала 11
    ARCH_ENTRYS_CH12 = 0x090A # Количество записей в архиве для канала 12

    """Период ведения архива"""
    ARCH_PER_CH1    = 0x090F # Период ведения архива для канала 1
    ARCH_PER_CH2    = 0x0910 # Период ведения архива для канала 2
    ARCH_PER_CH3    = 0x0911 # Период ведения архива для канала 3
    ARCH_PER_CH4    = 0x0912 # Период ведения архива для канала 4
    ARCH_PER_CH5    = 0x0913 # Период ведения архива для канала 5
    ARCH_PER_CH6    = 0x0914 # Период ведения архива для канала 6
    ARCH_PER_CH7    = 0x0915 # Период ведения архива для канала 7
    ARCH_PER_CH8    = 0x0916 # Период ведения архива для канала 8

    ARCH_PER_CH9    = 0x0917 # Период ведения архива для канала 9
    ARCH_PER_CH10   = 0x0918 # Период ведения архива для канала 10
    ARCH_PER_CH11   = 0x0919 # Период ведения архива для канала 11
    ARCH_PER_CH12   = 0x091A # Период ведения архива для канала 12