主逻辑(通信暂时只有抽象定义)

This commit is contained in:
2025-10-08 17:44:44 +08:00
parent d57d7cba70
commit c370aa9a4a
9 changed files with 516 additions and 17 deletions

View File

@@ -2,29 +2,89 @@
# -*- coding: utf-8 -*-
"""
猪舍主控系统主程序入口
程序入口 (双线程生产者-消费者模型)
主线程 (生产者):
- 职责以最高优先级不间断监听LoRa数据并将数据包放入任务队列。
- 特点永远不执行耗时操作保证LoRa数据接收的实时性。
工作线程 (消费者):
- 职责:从任务队列中取出数据包,并进行耗时的业务处理。
- 特点:可能会长时间阻塞,但不影响主线程的数据接收。
"""
import time
# import struct # 根据需要保留或删除
# import client_pb # 根据需要保留或删除
import _thread
import config
import uqueue # 导入我们自己创建的本地uqueue模块
# 导入接口和实现
from lora.lora_interface import ILoraHandler
from bus.bus_interface import IBusManager
from lora.lora_handler import LoRaHandler
from bus.rs485_manager import RS485Manager
from processor import Processor
# 导入工作线程的执行函数
from worker import worker_task
from logger import log
# --- 模块级变量定义 (带有类型提示) ---
lora_controller: ILoraHandler | None = None
bus_manager: IBusManager | None = None
processor: Processor | None = None
task_queue: uqueue.Queue | None = None
def main_loop():
def setup():
"""
主循环
初始化函数,负责创建所有对象实例、共享队列,并启动工作线程。
"""
print("猪舍控制系统启动...")
while True:
# 在这里添加你的逻辑
time.sleep(1) # 避免空循环占用过多CPU
global lora_controller, bus_manager, processor, task_queue
# 程序入口
log("--- 系统初始化开始 ---")
# 1. 初始化硬件驱动和业务处理器
lora_controller = LoRaHandler()
bus_manager = RS485Manager()
processor = Processor(lora_handler=lora_controller, bus_manager=bus_manager)
# 2. 从配置文件读取队列长度,并创建线程安全的队列
queue_size = config.SYSTEM_PARAMS.get('task_queue_max_size', 10)
task_queue = uqueue.Queue(maxsize=queue_size)
log(f"任务队列已创建,最大容量: {queue_size}")
# 3. 启动工作线程
_thread.start_new_thread(worker_task, (task_queue, processor))
log("--- 系统初始化完成 ---")
def loop():
"""
主线程循环函数 (生产者)。
只负责监听LoRa并将数据放入队列。
"""
packet = lora_controller.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__":
try:
main_loop()
except KeyboardInterrupt:
print("程序被中断")
except Exception as e:
print(f"程序异常: {e}")
setup()
log("--- 主线程进入循环 (LoRa监听) ---")
while True:
loop()