#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2024 xukaiming
# All rights reserved

from eeprom import EEPROM


class Config:
    dicParamAddr = {
        "SET_TestTime": 0x003D,
        "SetTempra": 0x003C,
        "Flow12": 0x003B,
        "Flow11": 0x003A,
        "Flow07": 0x0036,
        "Flow06": 0x0035,
        "Flow10": 0x0039,
        "Flow09": 0x0038,
        "Flow08": 0x0037,
        "Flow05": 0x0034,
        "Flow04": 0x0033,
        "Flow03": 0x0032,
        "Flow02": 0x0031,
        "Flow01": 0x0030,
        "KD4": 0x0067,
        "KD3": 0x0066,
        "KD2": 0x0065,
        "KD1": 0x0064,
        "KI2": 0x0063,
        "KI1": 0x0062,
        "KP2": 0x0061,
        "KP1": 0x0060,
        "Flow12_k": 0x005B,
        "Flow11_k": 0x005A,
        "Flow07_k": 0x0056,
        "Flow06_k": 0x0055,
        "Flow10_k": 0x0059,
        "Flow09_k": 0x0058,
        "Flow08_k": 0x0057,
        "Flow05_k": 0x0054,
        "Flow04_k": 0x0053,
        "Flow03_k": 0x0052,
        "Flow02_k": 0x0051,
        "Flow01_k": 0x0050,
        "Flow12_b": 0x004B,
        "Flow11_b": 0x004A,
        "Flow07_b": 0x0046,
        "Flow06_b": 0x0045,
        "Flow10_b": 0x0049,
        "Flow09_b": 0x0048,
        "Flow08_b": 0x0047,
        "Flow05_b": 0x0044,
        "Flow04_b": 0x0043,
        "Flow03_b": 0x0042,
        "Flow02_b": 0x0041,
        "Flow01_b": 0x0040,
        "Tempr_b": 0x004C,
        "Tempra_k": 0x005C
    }

    def __init__(self, ee: EEPROM):
        self.SET_TestTime = 500  #0x003D
        self.SetTempra = 500  #0x003C

        self.Flow12 = 500  # 0x003B
        self.Flow11 = 500  # 0x003A
        self.Flow07 = 500  # 0x0036
        self.Flow06 = 500  # 0x0035
        self.Flow10 = 500  # 0x0039
        self.Flow09 = 500  # 0x0038
        self.Flow08 = 500  # 0x0037
        self.Flow05 = 500  # 0x0034
        self.Flow04 = 500  # 0x0033
        self.Flow03 = 500  # 0x0032
        self.Flow02 = 500  # 0x0031
        self.Flow01 = 500  # 0x0030

        self.KD4 = 500  # 0x0067
        self.KD3 = 500  # 0x0066
        self.KD2 = 500  # 0x0065
        self.KD1 = 500  # 0x0064
        self.KI2 = 500  # 0x0063
        self.KI1 = 500  # 0x0062
        self.KP2 = 500  # 0x0061
        self.KP1 = 500  # 0x0060

        self.Flow12_k = 500  # 0x005B
        self.Flow11_k = 500  # 0x005A
        self.Flow07_k = 500  # 0x0056
        self.Flow06_k = 500  # 0x0055
        self.Flow10_k = 500  # 0x0059
        self.Flow09_k = 500  # 0x0058
        self.Flow08_k = 500  # 0x0057
        self.Flow05_k = 500  # 0x0054
        self.Flow04_k = 500  # 0x0053
        self.Flow03_k = 500  # 0x0052
        self.Flow02_k = 500  # 0x0051
        self.Flow01_k = 500  # 0x0050
        self.Flow12_b = 500  # 0x004B
        self.Flow11_b = 500  # 0x004A
        self.Flow07_b = 500  # 0x0046
        self.Flow06_b = 500  # 0x0045
        self.Flow10_b = 500  # 0x0049
        self.Flow09_b = 500  # 0x0048
        self.Flow08_b = 500  # 0x0047
        self.Flow05_b = 500  # 0x0044
        self.Flow04_b = 500  # 0x0043
        self.Flow03_b = 500  # 0x0042
        self.Flow02_b = 500  # 0x0041
        self.Flow01_b = 500  # 0x0040

        self.Tempr_b = 500  # 0x004C
        self.Tempra_k = 500  # 0x005C
      
        self.load_param(ee) 
 
    def save_param(self, ee: EEPROM):
        """使用反射保存所有变量（除了dicParamAddr）到EEPROM"""
        # 获取所有实例属性
        for attr_name in dir(self):
            # 跳过内置属性、方法和dicParamAddr
            if not attr_name.startswith('_') and attr_name != 'dicParamAddr' and not callable(getattr(self, attr_name)):
                if attr_name in self.dicParamAddr:
                    value = getattr(self, attr_name)
                    addr = self.dicParamAddr[attr_name] * 2 
                    value = (value & 0xFFFF) - (0x10000 if value & 0x8000 else 0)
                    ee.write_word(addr, value)
                    print(f"Saving \t{attr_name} \t= {value} \tto addr: {addr:04X}")

    def load_param(self, ee: EEPROM):
        """使用反射从EEPROM加载所有变量（除了dicParamAddr）"""
        # 获取所有实例属性
        for attr_name in dir(self):
            # 跳过内置属性、方法和dicParamAddr
            if not attr_name.startswith('_') and attr_name != 'dicParamAddr' and not callable(getattr(self, attr_name)):
                if attr_name in self.dicParamAddr:
                    addr = self.dicParamAddr[attr_name] * 2
                    value = ee.read_word(addr) & 0xFFFF 
                    value = (value & 0xFFFF) - (0x10000 if value & 0x8000 else 0)
                    setattr(self, attr_name, value)
                    print(f"Loading {attr_name} \t= {value} \tfrom addr: {addr:04X}")
 


if __name__ == "__main__":
    eeprom = EEPROM()
    config = Config(eeprom)
    
    # 修改一些值
    config.KP1 = 100
    config.Flow01 = 200

        # 保存到EEPROM
    config.save_param(eeprom)
    
    # 从EEPROM加载
    config.load_param(eeprom)