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
| """ NXP NCJ29D6 双模式: 数字钥匙 + CPD
时间分割方案: - 车辆行驶中: 数字钥匙待机 + CPD雷达模式 - 车辆停泊后: 纯CPD雷达检测 - 接近车辆时: 数字钥匙测距激活 """
class NCJ29D6Controller: """ NCJ29D6 UWB 控制器模拟 管理数字钥匙和CPD两种模式的时间调度 """ CHANNEL_CONFIG = { 'channel_5': {'band': '6.5 GHz', 'bandwidth': '500 MHz', 'use': 'digital_key'}, 'channel_6': {'band': '6.5 GHz', 'bandwidth': '500 MHz', 'use': 'digital_key'}, 'channel_8': {'band': '7.5 GHz', 'bandwidth': '500 MHz', 'use': 'cpd_radar'}, 'channel_9': {'band': '8.0 GHz', 'bandwidth': '500 MHz', 'use': 'cpd_radar'}, } MODES = { 'PARKED_CPD': { 'description': '车辆停泊后的CPD检测模式', 'cycle_ms': 1000, 'pulse_duration': '2ms', 'sleep_duration': '998ms', 'detection_range': '1.5m', 'power_consumption': '< 10mW', }, 'DRIVING_KEY': { 'description': '行驶中数字钥匙待机', 'cycle_ms': 100, 'listening_duration': '5ms', 'sleep_duration': '95ms', 'detection_range': '3m', 'power_consumption': '< 50mW', }, 'APPROACH_KEY': { 'description': '检测到手机接近时的主动测距', 'cycle_ms': 20, 'ranging_duration': '10ms', 'sleep_duration': '10ms', 'detection_range': '3m', 'power_consumption': '< 200mW', }, 'CPD_ALERT': { 'description': 'CPD检测到存在后的持续监控', 'cycle_ms': 200, 'pulse_duration': '4ms', 'sleep_duration': '196ms', 'detection_range': '1.5m', 'power_consumption': '< 30mW', } } def __init__(self): self.current_mode = 'PARKED_CPD' self.cpd_detected = False self.phone_detected = False def run_cycle(self, vehicle_state: str, phone_rssi: float): """ 运行一个工作周期 Args: vehicle_state: 'driving' | 'parked' | 'approaching' phone_rssi: 手机UWB信号强度(dBm), None表示无信号 """ if vehicle_state == 'driving': self.current_mode = 'DRIVING_KEY' elif vehicle_state == 'parked': if phone_rssi is not None and phone_rssi > -70: self.current_mode = 'APPROACH_KEY' else: if self.cpd_detected: self.current_mode = 'CPD_ALERT' else: self.current_mode = 'PARKED_CPD' self.cpd_detected = self._perform_cpd_scan() elif vehicle_state == 'approaching': self.current_mode = 'APPROACH_KEY' return self.MODES[self.current_mode] def _perform_cpd_scan(self) -> bool: """ 执行CPD雷达扫描 UWB雷达检测原理: 1. 发射超宽带脉冲 2. 接收反射信号 3. 多普勒分析检测微动(呼吸/心跳) 4. 与静态背景对比 """ import random return random.random() > 0.95 def get_alert_level(self) -> dict: """获取警报等级""" if not self.cpd_detected: return {'level': 'none', 'action': 'none'} return { 'level': 'warning', 'action': 'send_notification', 'message': '检测到车内有生命体征,请检查后座', 'channels': ['app_push', 'horn', 'hazard_lights'], 'escalation_delay': '30s后升级为报警' }
if __name__ == "__main__": controller = NCJ29D6Controller() scenarios = [ ('driving', None, '正常行驶'), ('parked', -45, '停泊,手机在附近'), ('parked', None, '停泊,无手机信号'), ('approaching', -55, '用户走向车辆'), ] for state, rssi, desc in scenarios: mode = controller.run_cycle(state, rssi) print(f"\n场景: {desc}") print(f" 模式: {controller.current_mode}") print(f" 功耗: {mode['power_consumption']}") print(f" 周期: {mode['cycle_ms']}ms") print(f" 范围: {mode['detection_range']}") if controller.cpd_detected: alert = controller.get_alert_level() print(f" ⚠️ CPD警报: {alert['message']}")
|