调整以适应esp32
This commit is contained in:
89
main.py
Normal file
89
main.py
Normal file
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
程序主入口 (双线程生产者-消费者模型)
|
||||
|
||||
主线程 (生产者):
|
||||
- 职责:以最高优先级不间断监听LoRa数据,并将数据包放入任务队列。
|
||||
- 特点:永远不执行耗时操作,保证LoRa数据接收的实时性。
|
||||
|
||||
工作线程 (消费者):
|
||||
- 职责:从任务队列中取出数据包,并进行耗时的业务处理。
|
||||
- 特点:可能会长时间阻塞,但不影响主线程的数据接收。
|
||||
"""
|
||||
|
||||
import time
|
||||
import _thread
|
||||
from app.config import config
|
||||
from app.uqueue import Queue # 导入我们自己创建的本地uqueue模块
|
||||
|
||||
# 导入接口和实现
|
||||
from app.lora.lora_mesh_uart_passthrough_manager import LoRaMeshUartPassthroughManager
|
||||
from app.bus.rs485_manager import RS485Manager
|
||||
from app.processor import Processor
|
||||
|
||||
# 导入工作线程的执行函数
|
||||
from app.worker import worker_task
|
||||
from app.logs.logger import log
|
||||
|
||||
# --- 模块级变量定义 (带有类型提示) ---
|
||||
lora_manager: LoRaMeshUartPassthroughManager | None = None
|
||||
bus_manager: RS485Manager | None = None
|
||||
processor: Processor | None = None
|
||||
task_queue: Queue | None = None
|
||||
|
||||
|
||||
def setup():
|
||||
"""
|
||||
初始化函数,负责创建所有对象实例、共享队列,并启动工作线程。
|
||||
"""
|
||||
global lora_manager, bus_manager, processor, task_queue
|
||||
|
||||
log("--- 系统初始化开始 ---")
|
||||
|
||||
# 1. 初始化硬件驱动和业务处理器
|
||||
lora_manager = LoRaMeshUartPassthroughManager(config.LORA_CONFIG)
|
||||
bus_manager = RS485Manager(config.BUS_CONFIG, config.DEFAULT_TIMEOUTS)
|
||||
|
||||
processor = Processor(lora_handler=lora_manager, bus_manager=bus_manager)
|
||||
|
||||
# 2. 从配置文件读取队列长度,并创建线程安全的队列
|
||||
queue_size = config.SYSTEM_PARAMS.get('task_queue_max_size', 10)
|
||||
task_queue = Queue(maxsize=queue_size)
|
||||
log(f"任务队列已创建,最大容量: {queue_size}")
|
||||
|
||||
# 3. 启动工作线程
|
||||
_thread.start_new_thread(worker_task, (task_queue, processor))
|
||||
|
||||
log("--- 系统初始化完成 ---")
|
||||
|
||||
|
||||
def loop():
|
||||
"""
|
||||
主线程循环函数 (生产者)。
|
||||
只负责监听LoRa,并将数据放入队列。
|
||||
"""
|
||||
packet = lora_manager.receive_packet()
|
||||
|
||||
if packet:
|
||||
if task_queue.full():
|
||||
log("警告:任务队列已满,新的LoRa数据包被丢弃!")
|
||||
return
|
||||
|
||||
try:
|
||||
task_queue.put_nowait(packet)
|
||||
log(f"主线程:新LoRa数据包已入队。当前队列大小: {task_queue.qsize()}")
|
||||
except Exception as e:
|
||||
log(f"错误:数据包入队失败: {e}")
|
||||
|
||||
time.sleep_ms(10)
|
||||
|
||||
|
||||
# --- 程序主执行区 ---
|
||||
if __name__ == "__main__":
|
||||
setup()
|
||||
|
||||
log("--- 主线程进入循环 (LoRa监听) ---")
|
||||
while True:
|
||||
loop()
|
||||
Reference in New Issue
Block a user