Files
virtual_simulation_midware/midware/drivers/bus_ad.py
2026-06-16 15:40:19 +08:00

190 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Tan mingyan
2026/3/9
AD 驱动示例bus_ad.py—— 补充参考
"""
# midware/drivers/bus_can.py
from .base_driver import BaseBusDriver
from typing import Optional, Dict, Any
from loguru import logger
import time
# 导入全局配置字典需确保main.py已提前加载CSV配置
from midware.config.base_config import DEVICE_CONFIG_DICT, get_device_config
import midware.config.base_config as base_config
from .base_driver import BaseBusDriver
from .renode_agent import renode
from midware.config.base_config import DEVICE_CONFIG_DICT
class BusADDriver(BaseBusDriver):
"""uart总线驱动实现适配"""
def _init_config(self):
self.config.setdefault("channel", 0) # CAN通道
self.config.setdefault("baudrate", 500000) # 500kbps
self.config.setdefault("frame_format", "standard") # 标准帧/扩展帧
logger.info(f"UART驱动配置初始化完成{self.config}")
def connect(self) -> bool:
try:
# 实际逻辑打开CAN通道
time.sleep(0.05)
self.is_connected = True
logger.info("CAN总线连接成功")
return True
except Exception as e:
logger.error(f"CAN总线连接失败{str(e)}")
return False
def disconnect(self) -> bool:
try:
self.is_connected = False
logger.info("CAN总线断开成功")
return True
except Exception as e:
logger.error(f"CAN总线断开失败{str(e)}")
return False
def send(self, data: bytes, **kwargs) -> bool:
if not self.is_connected:
logger.error("CAN驱动未连接发送失败")
return False
'''
try:
frame_id = kwargs.get("frame_id", 0x123) # CAN帧ID
is_extended = kwargs.get("is_extended", False) # 是否扩展帧
logger.info(
f"CAN发送数据帧ID0x{frame_id:X}|扩展帧:{is_extended}"
f"数据:{data.hex()}|长度:{len(data)}字节"
)
# 实际逻辑调用AD驱动发送接口
# 获取优先级,设备参数,地址等参数
return True
except Exception as e:
logger.error(f"CAN数据发送失败{str(e)}")
return False
'''
# ========== 核心步骤1从kwargs提取设备名称 ==========
#dev_name = kwargs.get("dev_name")[0]
dev_name = kwargs.get("dev_name")#2026/4/10
if not dev_name:
logger.error("AD发送失败kwargs中未传入dev_name设备名称")
return False
# ========== 核心步骤2从全局配置字典查找设备参数 ==========
# 检查全局配置是否加载
if not base_config.DEVICE_CONFIG_DICT:
logger.error("AD发送失败全局配置DEVICE_CONFIG_DICT未加载")
return False
# 查找当前设备的配置
#device_config = base_config.DEVICE_CONFIG_DICT.get(dev_name)
device_config = get_device_config().get(dev_name)
if not device_config:
logger.error(f"AD发送失败设备 {dev_name} 未在DEVICE_CONFIG_DICT中配置")
return False
# 提取关键配置项(兼容配置项缺失的情况)
try:
# 内存基地址转为16进制整数如"0x80000000" → 0x80000000
# mem_base_addr = int(str(device_config.get("base_addr", "0x0")), 16)#mem_base_addr = int(device_config.get("base_addr", "0x0"), 16)#内存基地址
mem_base_addr = int(device_config.get("base_addr", 0))
# 内存偏移地址
#mem_offset = int(str(device_config.get("offset_addr", "0x0")), 16)#内存偏移地址
mem_offset = int(device_config.get("offset_addr", 0))
# 发送缓存区大小(字节)
send_buffer_size = int(str(device_config.get("send_cache", 1024)))#发送缓存区大小
# 接收缓存区大小(字节)
recv_buffer_size = int(device_config.get("recv_cache", 1024))#接收缓存区大小
except (ValueError, TypeError) as e:
logger.error(f"AD发送失败{dev_name} 配置参数解析错误 → {str(e)}")
return False
# ========== 核心步骤3使用配置项处理发送逻辑 ==========
# 1. 校验数据长度不超过发送缓存区大小
if len(data) > send_buffer_size:
logger.error(
f"AD发送失败{dev_name} 数据长度 {len(data)} 超过发送缓存区大小 {send_buffer_size}"
)
return False
# 2. 模拟AD指令发送结合内存地址
logger.info(
f"AD发送指令设备{dev_name}"
f"内存基地址0x{mem_base_addr:X}偏移地址0x{mem_offset:X}"
f"发送缓存区:{send_buffer_size}B接收缓存区{recv_buffer_size}B"
f"数据:{data.hex()}|长度:{len(data)}字节"
)
# 实际业务逻辑:
# - 将数据写入指定内存地址mem_base_addr + mem_offset
# - 配置接收缓存区大小
# - 调用AD采集卡SDK发送指令
# ad_card.write_mem(mem_base_addr + mem_offset, data, send_buffer_size)
#AD0-AD6的寄存器写入策略
if(dev_name == "正电压采集热敏量采集"):
for i in range(4):
logger.info(f"AD发送指令{i}")
for j in range(14):
logger.info(f"AD发送指令{j}")
target_addr = mem_base_addr + mem_offset + i * 32 + j*8
canshu = data[2*(i*14+j)]*256 + data[2*(i*14+j)+1]# 2字节
sysbus_cmd = f"sysbus WriteDoubleWord {target_addr:#010x} {canshu:#006x}"
print(sysbus_cmd)
pass
## 外设名称+函数名+字符串参数 adc1 LoadRegistersFromHexString "55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA55AA"'
ad_cmd = f'{dev_name} LoadRegistersFromHexString "{data.hex()}"'
print(ad_cmd)
logger.info(f"AD发送指令{ad_cmd}")
response = renode.send_sync(ad_cmd,10)#2026/4/10
ad_cmd2 = f'{dev_name} ReadAllChannelsToString02'
logger.info(f"AD发送指令{ad_cmd2}")
response = renode.send_sync(ad_cmd2,10)#2026/4/10
return True
def recv(self, timeout: float = 0.1, **kwargs) -> Optional[bytes]:
if not self.is_connected:
logger.error("ADC驱动未连接接收失败")
return None
try:
# 模拟接收
#遍历所有AD外设循环发送读取指令例如 adc1 ReadAllChannelsToString02
#接收renode回复
time.sleep(0.51)
'''
mock_data = b"\x11\x22\x33\x44"
logger.debug(f"AD接收数据{mock_data.hex()}")
#2026/4/10
dev_name = kwargs.get("dev_name")
if not dev_name:
logger.error("AD接收失败kwargs中未传入dev_name设备名称")
return None
cfg = DEVICE_CONFIG_DICT[dev_name]
base = int(cfg["内存基地址"], 16)
offset = int(cfg["内存偏移地址"], 16)
addr = base + offset
# ======================
# 调用 Renode 读取数据
# ======================
cmd = f"read 0x{addr:X}"
hex_str = renode.send_sync(cmd)
#return bytes.fromhex(hex_str.strip())
logger.info(f"AD接收数据{mock_data.hex()}")
return mock_data
'''
return None
except Exception as e:
logger.error(f"AD数据接收失败{str(e)}")
return None