-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathicharger_const.py
More file actions
180 lines (160 loc) · 7 KB
/
Copy pathicharger_const.py
File metadata and controls
180 lines (160 loc) · 7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
"""
iCharger Constants Module
All Modbus addresses, operation codes, and status definitions for iCharger devices.
Based on iCharger MODBUS Protocol V2.1 and johncclayton/electric reference implementation.
"""
# =============================================================================
# USB HID Settings
# =============================================================================
VENDOR_ID = 0x0483 # STMicroelectronics
PRODUCT_ID = 0x5751 # iCharger
HID_PACKET_SIZE = 64
HID_FRAME_TYPE = 0x30
# =============================================================================
# Modbus Register Addresses (Read-Only, Function Code 0x04)
# =============================================================================
ADDR_DEVICE_INFO = 0x0000 # Device ID, serial, versions
ADDR_CHANNEL_1 = 0x0100 # Channel 1 data
ADDR_CHANNEL_2 = 0x0200 # Channel 2 data
# =============================================================================
# Modbus Register Addresses (Read/Write, Function Codes 0x03/0x10)
# =============================================================================
ADDR_CONTROL = 0x8000 # Control registers
ADDR_SYSTEM = 0x8400 # System settings
ADDR_MEM_INDEX = 0x8800 # Preset index (64 slots)
ADDR_MEMORY = 0x8C00 # Preset data
# Aliases for compatibility
CONTROL_BASE = ADDR_CONTROL
PRESET_INDEX_BASE = ADDR_MEM_INDEX
PRESET_DATA_BASE = ADDR_MEMORY
# =============================================================================
# Control Register Offsets (from ADDR_CONTROL)
# =============================================================================
CTRL_OPERATION = 0 # Operation type
CTRL_MEMORY = 1 # Memory slot
CTRL_CHANNEL = 2 # Channel number
CTRL_ORDER_LOCK = 3 # Order unlock value
CTRL_ORDER = 4 # Order command
CTRL_LIMIT_CURRENT = 5 # Current limit (mA)
CTRL_LIMIT_VOLTAGE = 6 # Voltage limit (mV)
# =============================================================================
# Order Commands
# =============================================================================
ORDER_STOP = 0
ORDER_RUN = 1
ORDER_MODIFY = 2
ORDER_WRITE_SYS = 3
ORDER_WRITE_MEM_HEAD = 4
ORDER_WRITE_MEM = 5
ORDER_TRANS_LOG_ON = 6 # Enable LogView transmission
ORDER_TRANS_LOG_OFF = 7 # Disable LogView transmission
ORDER_MSGBOX_YES = 8
ORDER_MSGBOX_NO = 9
# Unlock value required before sending orders
ORDER_UNLOCK = 0x55AA
VALUE_ORDER_UNLOCK = ORDER_UNLOCK # Alias for compatibility
# =============================================================================
# Operation Types
# =============================================================================
OP_CHARGE = 0
OP_STORAGE = 1
OP_DISCHARGE = 2
OP_CYCLE = 3
OP_BALANCE = 4
OP_MEASURE_IR = 5
# =============================================================================
# Channel Data Offsets (from ADDR_CHANNEL_x)
# =============================================================================
CH_TIMESTAMP_LO = 0 # Timestamp low word (ms)
CH_TIMESTAMP_HI = 1 # Timestamp high word
CH_POWER_LO = 2 # Power low word (mW)
CH_POWER_HI = 3 # Power high word
CH_CURRENT = 4 # Current (signed, 10mA units)
CH_INPUT_VOLTAGE = 5 # Input voltage (10mV units)
CH_OUTPUT_VOLTAGE = 6 # Output/pack voltage (mV)
CH_CAPACITY_LO = 7 # Capacity low word (mAh)
CH_CAPACITY_HI = 8 # Capacity high word
CH_INT_TEMP = 9 # Internal temp (0.1°C)
CH_EXT_TEMP = 10 # External temp (0.1°C)
CH_CELL_VOLTAGE = 11 # Cell voltages start (8 words, mV)
CH_CELL_IR = 35 # Cell IR start (8 words, 0.1mΩ)
CH_RUN_STATUS = 55 # Run status code
CH_RUN_ERROR = 56 # Run error code
CH_DIALOG_ID = 57 # Dialog box ID
# =============================================================================
# Run Status Codes
# =============================================================================
STATUS_STOP = 0
STATUS_WAIT_START = 1
STATUS_CHG_CC = 2
STATUS_CHG_CV = 3
STATUS_CHG_CV_WAITING = 4
STATUS_DISCHARGE_CC = 5
STATUS_DISCHARGE_CV = 6
STATUS_CHECK = 7
STATUS_TRICKLE = 8
STATUS_REDUCE_CURRENT = 9
STATUS_CHG_CV_FINISHED = 10
STATUS_STOP_ERROR = 11
STATUS_DISCHARGE_CV_STAGE = 12
STATUS_PROTECT = 13
STATUS_ERROR_STATE = 14
STATUS_BALANCE_START = 40
STATUS_BALANCE_CHECK = 41
STATUS_BALANCE_OK = 42
STATUS_MEASURE_IR = 43
# Human-readable status names
RUN_STATUS_NAMES = {
STATUS_STOP: "STOP",
STATUS_WAIT_START: "WAIT_START",
STATUS_CHG_CC: "CHARGE_CC",
STATUS_CHG_CV: "CHARGE_CV",
STATUS_CHG_CV_WAITING: "CHG_CV_WAITING",
STATUS_DISCHARGE_CC: "DISCHARGE_CC",
STATUS_DISCHARGE_CV: "DISCHARGE_CV",
STATUS_CHECK: "CHECK",
STATUS_TRICKLE: "TRICKLE",
STATUS_REDUCE_CURRENT: "REDUCE_CURRENT",
STATUS_CHG_CV_FINISHED: "CHG_CV_FINISHED",
STATUS_STOP_ERROR: "STOP_ERROR",
STATUS_DISCHARGE_CV_STAGE: "DISCHARGE_CV_STAGE",
STATUS_PROTECT: "PROTECT",
STATUS_ERROR_STATE: "ERROR_STATE",
STATUS_BALANCE_START: "BALANCE_START",
STATUS_BALANCE_CHECK: "BALANCE_CHECK",
STATUS_BALANCE_OK: "BALANCE_OK",
STATUS_MEASURE_IR: "MEASURE_IR",
}
# =============================================================================
# Device IDs
# =============================================================================
DEVICE_ID_308_DUO = 66
DEVICE_ID_4010_DUO = 64
DEVICE_ID_406_DUO = 68
DEVICE_ID_X8 = 69
DEVICE_ID_X12 = 71
# =============================================================================
# Auto IR Measurement Defaults
# =============================================================================
IR_TARGET_CURRENT_MA = 4000 # Target discharge current for IR measurement
IR_MAX_WAIT_SECONDS = 15 # Maximum wait time for current ramp-up
IR_PULSE_DURATION_S = 0.5 # Discharge pulse duration
IR_TEMP_COEFFICIENT = 0.004 # 0.4% per °C temperature coefficient
# =============================================================================
# Battery Fingerprinting
# =============================================================================
FP_WEIGHT_IR = 0.7 # Weight of IR ratio in similarity
FP_WEIGHT_OCV = 0.3 # Weight of OCV pattern in similarity
FP_SIMILARITY_THRESHOLD = 0.85 # Minimum similarity for match
# =============================================================================
# USB/Communication
# =============================================================================
MAX_READ_WORDS = 30 # USB HID limit: 64 bytes max payload
DEFAULT_BAUD = 115200 # Serial baud rate (for RTU mode)
DEFAULT_TIMEOUT = 2.0 # Default communication timeout
def get_status_name(status_code: int) -> str:
"""Get human-readable name for status code."""
return RUN_STATUS_NAMES.get(status_code, f"UNKNOWN({status_code})")
def get_channel_base(channel: int) -> int:
"""Get base address for channel (0 or 1)."""
return ADDR_CHANNEL_1 if channel == 0 else ADDR_CHANNEL_2