主任务控制子任务通信流程

news2024/9/23 1:19:52

主任子任务通讯流程

#define WM_TAKE_STOCK_CMD					172				//MAIN->TAKE 任务流程
		#define TAKE_STOCK_CMD_FIND_TRAY			1			// 找托盘
#define WM_TAKE_STOCK_CMD_EXC				173				//TAKE内部使用
		#define TAKE_STOCK_EXE_OK					0
#define WM_TAKE_STOCK_TASK_MSG				174				//MAIN->TAKE 发送消息
		#define TAKE_STOCK_MSG_CAL_TRAY				1
		#define TAKE_STOCK_MSG_CLOSE				2
		#define TAKE_STOCK_MSG_CHANGE_ENDPOS		3
#define WM_TAKE_STOCK_EXC_TOMAIN			175				//TAKE->MAIN任务报警异常
		#define TAKE_STOCK_EXC_ALARM				1
#define WM_TAKE_STOCK_TASK_API				176				//TAKE任务执行结果
		#define WM_TASK_STOCK_TASK_FIND_TRAY_OK		1		//找托盘成功
		#define WM_TASK_STOCK_TASK_CLOSE_OK			2		//任务中止关闭成功
//MIAN_TASK win_SubWalk_Pos_Main_Ctrl.c 
/**
 * @brief  窗口函数
 * @param  Type: 信息的类型
 * @param  Parameter: 数值型信息
 * @param  Info: 字符串型信息
 * @param  hSrcWin: 源窗口,消息的触发窗口
 * @param  hTagWin: 目标窗口,消息的目标窗口
 * @retval None
 * @note   具体处理接收到的信息(如按键输入等),每一个功能窗口都要有一个这样的函数
 *         这是一个内部函数,其他模块的窗口函数可以与它同名 
 */
static void WindowProc(WORD Type, WORD Parameter, BYTE *Info, WORD hSrcWin, WORD hTagWin)
{
	switch( Type )		// 根据信息类型,提取及处理相应的信息
	{					
	case WM_CLOSE:
			CloseWindow(MAIN_TASK);
		break;
	case WM_REDRAW:
			Initialize();
			OpenWindow(MAIN_TASK,&Window);
		break;
	case WM_REFRESH:
	{
		//...
		
		if(sTakeOut && sTakeOut_AlarmCode){
			win_SubWalk_Emergency_Stop(sTakeOut_AlarmCode);
			return;
		}
	}
		break;
	case WM_MOTOR_ENCODER_RESET_CMD:
			switch(Parameter)
			{
			case MOTOR_ENCODER_RESET_OK:
					//向TAKE_TASK发送指令  MAIN_TASK->TAKE_TASK
					(*ActiveWindowProc)(TAKE_TASK)(WM_TAKE_STOCK_CMD, TAKE_STOCK_CMD_FIND_TRAY, (u8*)&uExtMsg, SYS_WIN_SUBWALK_POS_MAIN_CTRL,0);
				break;
			case MOTOR_ENCODER_RESET_ERR:
				break;
			default:
					ASSERT(ERROR);
				break;
			}
		break;
	//接收TAKE_TASK返回  TAKE_TASK->MAIN_TASK
	case WM_TAKE_STOCK_TASK_API: //盘点任务结果
		switch(Parameter)
		{
		case WM_TASK_STOCK_TASK_FIND_TRAY_OK: //盘点任务成功
				; //do nothing
			break;	
		case WM_TASK_STOCK_TASK_CLOSE_OK: //盘点任务关闭
		
			break;
		default:
				ASSERT(ERROR);
			break;
		}
		break;
	//接收TAKE_TASK 报错返回 
	case WM_TAKE_STOCK_EXC_TOMAIN:
		switch(Parameter)
		{
		case TAKE_STOCK_EXC_ALARM: 
				if(Info!=NULL){
					sTakeOutWindowMsg = *(WINDOW_MSG*)Info; //变叉报警
					RT_LOG(RT_LOG_WCS,("盘点流程报警AlarmCode:0x%04X\n",sTakeOutWindowMsg.Parameter));
					
					//一定是处于激活状态,需要判断当前活动窗口是不是自身
					if(Window.Active){//当前窗口活动中 
						sTakeOut_AlarmCode = sTakeOutWindowMsg.Parameter;
						if(GetCurrentWindow(MAIN_TASK) == &Window)
						{
							win_SubWalk_Emergency_Stop(sTakeOut_AlarmCode);
							return;
						}
						else{ //等待主任务流程恢复到当前窗口后在WM_REFRESH中执行异常处理流程,保证消息能正常处理
							;
						}
					}
					else{//当前窗口已关闭 - 不处理
						;
					}
				}
			break;	
		default:
				ASSERT(ERROR);
			break;
		}
		break;
	case WM_ALARM_CODE:
			CloseWindow(MAIN_TASK);
			(*ActiveWindowProc(MAIN_TASK))(WM_ALARM_CODE,Parameter,Info,hSrcWin,hTagWin);
		break;
	default:
		break;
	}
}
//TAKE_TASK win_TakeStock.c
/**
 * @brief  窗口函数
 * @param  Type: 信息的类型
 * @param  Parameter: 数值型信息
 * @param  Info: 字符串型信息
 * @param  hSrcWin: 源窗口,消息的触发窗口
 * @param  hTagWin: 目标窗口,消息的目标窗口
 * @retval None
 * @note   具体处理接收到的信息(如按键输入等),每一个功能窗口都要有一个这样的函数
 *         这是一个内部函数,其他模块的窗口函数可以与它同名 
 */
static void WindowProc(WORD Type, WORD Parameter, BYTE *Info, WORD hSrcWin, WORD hTagWin)
{
	int i;
	switch( Type )		// 根据信息类型,提取及处理相应的信息
	{					
	case WM_CLOSE:
			CloseWindow(TAKE_TASK);
		break;
	case WM_REDRAW:
			Initialize();
			OpenWindow(TAKE_TASK,&Window);
		break;
	case WM_REFRESH:
			if( Take_Command_Irq[0].Idle ){
				TakeStock_Start_One_Irq();
			}
		break;
	case WM_TAKE_STOCK_CMD_EXC: 	//TAKE_STOCK执行结果
			if( Take_Command_Irq[0].Idle ){
				Take_Command_Irq[0].Idle = 0;
				// 后续任务往前移位   发送命令
				for(i=0;i<(sizeof(Take_Command_Irq)/sizeof(Take_Command_Irq[0])-1);i++){	
					Take_Command_Irq[i] = Take_Command_Irq[i+1];
				}
				Take_Command_Irq[sizeof(Take_Command_Irq)/sizeof(Take_Command_Irq[0])-1].Idle = 0;
				
				if( Take_Command_Irq[0].Idle ){
					TakeStock_Start_One_Irq();
				}
			}
		break;
	case WM_TAKE_STOCK_TASK_API: //任务返回的结果
			if( Take_Command_Irq[0].Idle && sExtMsg.srcWindow!=NULL){
				(sExtMsg.srcWindow->WindowProc)(Type,Parameter,Info,hSrcWin,sUser.SrcWindows);
			}
			//发送给TAKE_TASK消息
			(*ActiveWindowProc)(TAKE_TASK)(WM_TAKE_STOCK_CMD_EXC, TAKE_STOCK_EXE_OK, 0, SYS_WIN_TAKE_STOCK, 0);
		break;
	case WM_TAKE_STOCK_CMD:	//收到一个发送请求
			TakeCommandEnQueue(Parameter,Info,hSrcWin,hTagWin);
		break;
	case WM_ALARM_CODE:
			//发给主任务处理
			if( Take_Command_Irq[0].Idle && sExtMsg.srcWindow!=NULL){
				sTaskExcMsg.Type = Type;
				sTaskExcMsg.Parameter = Parameter;
				sTaskExcMsg.Info = Info;
				sTaskExcMsg.hSrcWin = hSrcWin;
				sTaskExcMsg.hTagWin = sUser.SrcWindows;
				
				(sExtMsg.srcWindow->WindowProc)(WM_TAKE_STOCK_EXC_TOMAIN,TAKE_STOCK_EXC_ALARM,(u8*)&sTaskExcMsg,SYS_WIN_TAKE_STOCK,0);
			}
			//发送给TAKE_TASK消息
			(*ActiveWindowProc)(TAKE_TASK)(WM_TAKE_STOCK_CMD_EXC, TAKE_STOCK_EXE_OK, 0, SYS_WIN_TAKE_STOCK, 0);
		break;
	default:
		break;
	}
}

/**
 * @brief 执行Kinco电机TAKE_STOCK指令
 */
static void TakeStock_Command(u16 uCommand, TAKESTOCK_USERDATA hUser)
{
	sExtMsg = Take_Command_Irq[0].Msgs;
	
	switch(uCommand)
	{
	case TAKE_STOCK_CMD_FIND_TRAY:
			win_TakeStock_FindTray(sExtMsg.TakeOut.StartPos,sExtMsg.TakeOut.EndPos);
		break;
	default:
			ASSERT(ERROR);
		break;
	}
}

/**
 * @brief 执行TAKE_STOCK命令
 */
static void TakeStock_Start_One_Irq(void)
{
	sUser.SrcWindows = Take_Command_Irq[0].SrcWindows;

	TakeStock_Command(Take_Command_Irq[0].Command, sUser);
}

//TAKE_TASK win_TakeStock_FindTray.c

/**
 * @brief  盘点任务找托盘
 * @param  None
 * @retval None
 * @note   窗口加载函数,在窗口集合注册当前窗口;
 *         如果要每次打开窗口时都进行初始化,则应在此加入初始化
 */
void win_TakeStock_FindTray(u16 hStartPos,u16 hEndPos)
{
	if (Window.Active)return;
	if (RegisterWindow(TAKE_TASK,&Window)){
		MyRGV_Message.Take_Sys_Win = SYS_WIN_TAKE_STOCK_FIND_TRAY;
		Initialize();
		OpenWindow(TAKE_TASK,&Window);

		//...
		if(sAlarmCode){ 
			LOG_ALARM_CODE(sAlarmCode);
			CloseWindow(TAKE_TASK);
			(*ActiveWindowProc)(TAKE_TASK)(WM_ALARM_CODE, sAlarmCode, 0, SYS_WIN_TAKE_STOCK_FIND_TRAY, 0);
			return;
		}
	}
}

/**
 * @brief  窗口函数
 * @param  Type: 信息的类型
 * @param  Parameter: 数值型信息
 * @param  Info: 字符串型信息
 * @param  hSrcWin: 源窗口,消息的触发窗口
 * @param  hTagWin: 目标窗口,消息的目标窗口
 * @retval None
 * @note   具体处理接收到的信息(如按键输入等),每一个功能窗口都要有一个这样的函数
 *         这是一个内部函数,其他模块的窗口函数可以与它同名 
 */
static void WindowProc(WORD Type, WORD Parameter, BYTE *Info, WORD hSrcWin, WORD hTagWin)
{
	switch( Type )		// 根据信息类型,提取及处理相应的信息
	{					
	case WM_CLOSE:
			CloseWindow(TAKE_TASK);
		break;
	case WM_REDRAW:
			Initialize();
			OpenWindow(TAKE_TASK,&Window);
		break;
	case WM_REFRESH:
		{
			FindTraySpace();
		}
		break;
	case WM_TAKE_STOCK_TASK_MSG: //接收MAIN_TASK的消息
		switch(Parameter)
		{
		case TAKE_STOCK_MSG_CAL_TRAY: //运动流程结束
			{
				//...
				CloseWindow(TAKE_TASK);
				(*ActiveWindowProc)(TAKE_TASK)(WM_TAKE_STOCK_TASK_API, WM_TASK_STOCK_TASK_FIND_TRAY_OK, 0, SYS_WIN_TAKE_STOCK_FIND_TRAY, 0);
			}
			break;
		case TAKE_STOCK_MSG_CHANGE_ENDPOS: //改变目标位置
				if(Info!=NULL){
					sEndPos = *(u16*)Info;
				}
			break;
		case TAKE_STOCK_MSG_CLOSE: //回收资源,在windowExit窗口调用
				CloseWindow(TAKE_TASK);
				(*ActiveWindowProc)(TAKE_TASK)(WM_TAKE_STOCK_TASK_API, WM_TASK_STOCK_TASK_CLOSE_OK, 0, SYS_WIN_TAKE_STOCK_FIND_TRAY, 0);
			break;
		default:
				ASSERT(ERROR);
			break;
		}
		break;
	case WM_TAKE_STOCK_CMD:	//收到一个发送请求
			TakeCommandEnQueue(Parameter,Info,hSrcWin,hTagWin);
		break;
	case WM_ALARM_CODE:
			CloseWindow(TAKE_TASK);
			(*ActiveWindowProc(TAKE_TASK))(WM_ALARM_CODE,Parameter,Info,hSrcWin,hTagWin);
		break;
	default:
		break;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构+图的基本应用

一、问题描述 求有向图的简单路径 编写一个程序&#xff0c;设计相关算法完成以下功能。 &#xff08;1&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有简单路径。 &#xff08;2&#xff09;输出如图所示的有向图 G 从顶点 5 到顶点 2 的所有长度为 3 的简单…

Qt编译配置OpenCV+opencv_contrib(使用cmake)

本文使用环境 OpenCV: 4.7.0 cmake: 3.30.2 Qt: 5.12.1一、配置环境变量 安装好OpenCV、Qt、cmake后&#xff0c;应配置好一下环境变量&#xff1a; 二、编译OpenCV 打开cmake&#xff0c;编译的源码路径选择opencv文件夹中的sources目录&#xff0c;在opencv文件夹下新建一…

代码随想录 day 38 动态规划

第九章 动态规划part06 322. 零钱兑换 如果求组合数就是外层for循环遍历物品&#xff0c;内层for遍历背包。 如果求排列数就是外层for遍历背包&#xff0c;内层for循环遍历物品。 这句话结合本题 大家要好好理解。 视频讲解&#xff1a;https://www.bilibili.com/video/BV14K…

【自用】Python爬虫学习(六):通过m3u8文件下载ts文件并合并为.mp4文件

Python爬虫学习&#xff08;六&#xff09; 下载视频&#xff08;简单版&#xff09;的步骤介绍第一步&#xff1a;在网页上找到.m3u8文件第二步&#xff1a;通过.m3u8文件下载对应的.ts视频文件第三步&#xff1a;依据.m3u8文件合并.ts文件为一个.mp4文件 下载视频&#xff08…

stm32智能颜色送餐小车(oled显示压力传感器重量)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…

PyQt编程快速上手

Python GUI安装 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;使得自己的程序看上去更加高大上&#xff0c;学会GUI编程可以使得自己的软件有可视化的结果。 如果你想用Python快速制作界面&#xff0c;可以安装PyQt&#xff1a…

Linux云计算 |【第二阶段】NETWORK-DAY6

主要内容&#xff1a; 企业网络综合项目分析、大型企业网络搭建 项目案例1 一家网络公司&#xff0c;有若干服务器&#xff0c;通过NAT技术将业务服务器与Internet互联&#xff1b;已有技术&#xff1a; ① 默认路由&#xff1a;实现到互联网数以万计网络访问的简化配置&…

Elasticsearch自动补全功能实践与Java API应用

Elasticsearch是一个强大的搜索引擎&#xff0c;它不仅支持全文搜索&#xff0c;还提供了自动补全功能&#xff0c;可以显著提升用户体验。自动补全功能允许用户在输入查询时实时显示建议项&#xff0c;帮助用户快速找到所需信息。本文将介绍如何使用Elasticsearch的RestHighLe…

配置Google API,用JavaScript和Python读取Google sheet里的数据

[发布时间是2024年8月。技术流程可能会存在一些变动] 源代码可以参考&#xff1a;victorspaceRMW/Read-Google-Sheet-with-API: The source code to read the Google Sheet with Google cloud API (github.com) 开头提醒一下各位公司&#xff0c;国内包括腾讯云华为云阿里云&…

echarts使图表组件根据屏幕尺寸变更而重新渲染大小

效果图&#xff1a; 通过 window.addEventListener(resize, this.resizeChart); 实现 完整代码&#xff1a; <template><div class"dunBlock"><div class"char2" id"char2" ref"chart"></div></div…

《光与夜之恋》3D建模含量超标,纯炫技还是释放新信号?

继叠纸的《恋与深空》之后&#xff0c;腾讯的《光与夜之恋》也卷起3D技术了。 《光与夜之恋》即将在8月12日上线的限定活动“大漠归墟”最新PV及男主六星卡面释出&#xff0c;相对于褒贬不一、引起争论的卡面美术&#xff0c;PV中的3D建模倒是收获了玩家的集体好评。 “大漠归…

读零信任网络:在不可信网络中构建安全系统18零信任代理

1. 零信任代理 1.1. 零信任代理是应用级代理服务器&#xff0c;用来保护零信任网络&#xff0c;它是处理认证、授权以及加密的基础设施 1.2. 零信任代理分为反向代理和前向代理两种工作模式 1.2.1. 运行时可以同时采用这两种工作模式&#xff0c;也可以只采用其中的一种 1.2…

libcurl8.9.1 上传json

在postman中 PUT----》body----》raw----》json 结构体定义&#xff1a; #define MAX_ARRAY_SIZE 5*1024*1024struct SMART_DATA_CACHE {char* buf;long dwTotalLen;SMART_DATA_CACHE(){dwTotalLen 0;buf nullptr;while (!buf) {try {buf new char[MAX_ARRAY_SIZE];}c…

C++:有序关联容器set

什么是有序关联容器 (1)顺序容器&#xff0c;容器中的元素是按它们在容器中的位置来顺序保存和访问的(可以理解是数组) (2)顺序容器有array、vector、deque、list、forward_list、string等 (3)关联容器中的元素是按关键字来保存和访问的&#xff0c;关联的意思就是关键字&…

STM32-外部中断-AFIO-串口-串口通信-串口中断(空闲中断和接收中断)-printf移植-ADC数模转换-初始化和读取光敏电阻AO

常用的中断包括外部中断、串口中断、定时器中断&#xff1b; 1、外部中断&#xff1a; 引脚复用按钮导致的外部中断&#xff1a; 注意&#xff1a;初始化引脚&#xff0c;添加引脚和EXTI输入线的映射&#xff1b;使用外部引脚的中断时需要使用AFIO映射&#xff1b; 操作步骤&…

如何获取android的SHA1或SHA256

在使用地图类的功能时&#xff0c;例如百度地图或者高德地图&#xff0c;会需要在开发者平台里填写SHA1或SHA256的指纹密钥&#xff0c;很多开发者小伙伴还不知道如何获取。当然关于如何获取android的SHA1或SHA256&#xff0c;网络上进行搜索已经有很多图文教程了&#xff0c;本…

mfc140u.dll丢失的科学修复手段,简单又方便的mfc140u.dll修复

遇到 "缺失 mfc140u.dll 文件" 的提示时可能会让你疑惑&#xff0c;但不用担心。这个文件是 Microsoft Visual C 2015 的重要组成部分&#xff0c;对运行特定程序非常关键。幸运的是&#xff0c;解决这一问题并不难。本文将简单指导你如何恢复或修复丢失的 mfc140u.d…

多台PC网络ADB连接同一台RK3399 Android7.1.2设备

在RK3399 Android7.1.2上面&#xff0c;进行网络ADB调试时&#xff0c;如果多台电脑连接同一台Android设备&#xff0c;第一台连接上的能正常操作&#xff0c;之后连接的看到设备状态为OFFLINE&#xff0c;分析了下ADBD相关代码&#xff0c;发现在ACCEPT Client的时候没有区分别…

设计师必备:2024最新PDF转CAD软件盘点

随着科技的飞速发展&#xff0c;设计师们不再受限于传统的设计流程&#xff0c;可以利用一些新欣的工具来提升工作效率、优化工作流程的新工具。其中&#xff0c;PDF转CAD工具成为了设计行业的一大热门话题。面对海量的数据和复杂的设计需求&#xff0c;一款高效、精准的PDF转C…

11、MySQL-SQL优化

目录 1、插入数据 1.1、批量插入 1.2、手动提交事务 1.3、主键顺序插入 1.4、大批量插入数据 2、主键优化 2.1 页分裂 2.2 主键顺序插入 2.3 主键乱序插入 2.4 页合并 2.5 主键的设计原则 3、order by优化 4、group by优化 5、limit优化 6、count优化 6.1 coun…