硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2157|回复: 4
收起左侧

【安富莱二代示波器教程】第7章 示波器设计—波形滑动浏览

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2018-6-29 15:33:40 | 显示全部楼层 |阅读模式
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=45785

第7章       示波器设计—波形滑动浏览

    类似手机的滑动功能用在示波器上还是比较实用的,可以用来调节波形位置和滑动浏览波形的存储记录。
7.1   滑动基础知识
7.2   滑动基础知识总结
7.3   滑动功能在窗口上的实现
7.4    总结



7.1  滑动基础知识
      滑动的实现是基于emWin提供的Motion功能。在emWin的官方手册中对这部分功能讲解的比较少,但是仍然需要大家去读一下,有一个大概的了解。
7.1.png


努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2018-6-29 15:34:29 | 显示全部楼层
7.2   滑动基础知识总结
    望大家务必看了emWin官方手册中Motion章节的内容,这里将这些知识点做个汇总,方便大家后面使用。
WM_MOTION_Enable()            使能motion
WM_MOTION_SetMoveable()      使能窗口X方向或者Y方向的Motion
WM_MOTION_SetMovement()     设置窗口以指定的速度移动一段距离。
=================
WM_MOTION_SetDeceleration()    设置窗口减速度
WM_MOTION_SetSpeed()          设置窗口的移动速度。
WM_MOTION_SetMotion()         设置初始速度和加速度。等同于上面两个函数之和
=======================
WM_MOTION_SetDefaultPeriod()  
设置指针输入设备(触摸,鼠标,键盘等)等释放后,减速度默认持续的时间。
1、如果窗口在移动中,将减速,直到停止运行。
2、如果窗口没有移动,但是使能了snap功能,那么窗口会在设置的时间内移动到下一个栅格内。
3、如果窗口在移动,且使能了snap功能,那么窗口会减速运动直到停止在最近的一个栅格上。

    上面的这些函数都是独立的操作Motion功能,而二代示波器中使用Motion功能是基于窗口的,其实就是把上面这些函数的功能在窗口上实现。下面我们就讲解二代示波器的Motion功能实现。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2018-6-29 15:36:37 | 显示全部楼层
7.3   滑动功能在窗口上的实现
    我们这里以二代示波器的滑动功能实现过程为例,给大家做个说明。

第1步:使能滑动,设置周期。
  1. WM_MOTION_Enable(1);              /* 使能滑动 */

  2. WM_MOTION_SetDefaultPeriod(100);  /* 设置滑动周期 */
复制代码

第2步:创建一个透明的窗口,正好覆盖600*400的波形显示区。
  1. hMotion = WM_CreateWindowAsChild(40,

  2.                                  40,

  3.                                   600,

  4.                                   400,

  5.                                   WM_HBKWIN,

  6.                                   WM_CF_MOTION_Y | WM_CF_SHOW | WM_CF_HASTRANS,

  7.                                   _cbMotion,

  8.                                   sizeof(pPara));

  9.                                       

  10. WM_SetUserData(hMotion, &pPara, sizeof(pPara));
复制代码
函数里面的标志WM_CF_MOTION_Y |WM_CF_SHOW | WM_CF_HASTRANS比较重要,滑动标志既可以在这里设置,也可以在窗口回调函数的WM_MOTION消息里面设置。
WM_CF_MOTION_Y:表示窗口支持垂直滑动。
WM_CF_MOTION_X:表示窗口支持水平滑动(在窗口回调里面进行了设置)。
WM_CF_HASTRANS:表示窗口透明,这个标志不要忘记设置,这样使用滑动功能的时候对示波器显示区没有任何影响。

第3步:也是最后一步,滑动窗口的回调函数。
    源代码是如下这样的:
  1. /*

  2. *********************************************************************************************************

  3. *    函 数 名: _cbMotion

  4. *    功能说明: Motion窗口的回调函数,主要是桌面图标的滑动处理

  5. *    形    参: pMsg  WM_MESSAGE类型指针变量  

  6. *    返 回 值: 无

  7. *********************************************************************************************************

  8. */

  9. static void _cbMotion(WM_MESSAGE * pMsg)

  10. {

  11.      WM_MOTION_INFO * pInfo;

  12.      WM_HWIN          hWin = pMsg->hWin;

  13.      PARA           * pPara;



  14.      switch (pMsg->MsgId)

  15.      {

  16.          case WM_MOTION:

  17.               WM_GetUserData(hWin, &pPara, sizeof(pPara));

  18.               pInfo = (WM_MOTION_INFO *)pMsg->Data.p;

  19.               switch (pInfo->Cmd)

  20.               {

  21.                    /* Motion功能初始化,设置X方向和Y方向都支持滑动 */

  22.                    case WM_MOTION_INIT:

  23.                        pInfo->Flags =  WM_CF_MOTION_X | WM_CF_MOTION_Y | WM_MOTION_MANAGE_BY_WINDOW;

  24.                        pInfo->SnapY = 1;

  25.                        pInfo->SnapX = 1;

  26.                        break;



  27.                    case WM_MOTION_MOVE:

  28.                        pPara->FinalMove = pInfo->FinalMove;

  29.                         /* Y轴方向,上下滑动 */

  30.                        if(g_Flag->ucMotionXY == 0)

  31.                        {

  32.                             if((pInfo->pState->Pressed == 1)&&(pInfo->pState->x <= 340))

  33.                             {

  34.                                  pPara->iCH1Pos += pInfo->dy;

  35.                                  if(pPara->iCH1Pos >= 440)

  36.                                  {

  37.                                      pPara->iCH1Pos = 440;

  38.                                  }

  39.                                  if(pPara->iCH1Pos <= 40)

  40.                                  {

  41.                                      pPara->iCH1Pos = 40;

  42.                                  }



  43.                                  g_DSO1->usRefPos = pPara->iCH1Pos;

  44.                             }

  45.                             else if((pInfo->pState->Pressed == 1)&&(pInfo->pState->x > 340))

  46.                             {                          

  47.                                  pPara->iCH2Pos += pInfo->dy;

  48.                                  if(pPara->iCH2Pos >= 440)

  49.                                  {

  50.                                      pPara->iCH2Pos = 440;

  51.                                  }

  52.                                  if(pPara->iCH2Pos <= 40)

  53.                                  {

  54.                                      pPara->iCH2Pos = 40;

  55.                                  }



  56.                                  g_DSO2->usRefPos = pPara->iCH2Pos;

  57.                             }



  58.                             WM_InvalidateArea(&rRefPos);

  59.                        }

  60.                        /* X轴方向,左右滑动 */

  61.                        else

  62.                        {

  63.                             if(pInfo->pState->Pressed == 1)

  64.                             {

  65.                                  g_DSO1->sCurTriStep -= pInfo->dx;

  66.                             }



  67.                             if(TriggerFlag == 0)

  68.                             {



  69.                             }

  70.                             else

  71.                             {

  72.                                  if(g_DSO1->sCurTriStep <= -724)

  73.                                  {

  74.                                      g_DSO1->sCurTriStep = -724;

  75.                                  }



  76.                                  if(g_DSO1->sCurTriStep >= 724)

  77.                                  {

  78.                                      g_DSO1->sCurTriStep = 724;

  79.                                  }



  80.                                  TriggerFlag = 2;

  81.                             }



  82.                             WM_InvalidateArea(&rTrigPos);

  83.                        }



  84.                        /* 更新当前的数据位置的箭头 */

  85.                        g_Flag->ucWaveRefresh = 1;

  86.                        break;



  87.                    case WM_MOTION_GETPOS:

  88.                        pInfo->yPos = pPara->iCH1Pos;

  89.                        //pInfo->xPos = pPara->iCH1Pos;

  90.                        break;

  91.               }

  92.               break;

  93.      }

  94. }
复制代码
为了方便看这个函数实现的功能,这里将其进一步简化成如下这样:、
  1. static void _cbMotion(WM_MESSAGE * pMsg)

  2. {

  3.      WM_MOTION_INFO * pInfo;

  4.      WM_HWIN          hWin = pMsg->hWin;

  5.      PARA           * pPara;



  6.      switch (pMsg->MsgId)

  7.      {

  8.          case WM_MOTION:

  9.               WM_GetUserData(hWin, &pPara, sizeof(pPara));

  10.               pInfo = (WM_MOTION_INFO *)pMsg->Data.p;

  11.               switch (pInfo->Cmd)

  12.               {

  13.                    /* Motion功能初始化,设置X方向和Y方向都支持滑动 */

  14.                    case WM_MOTION_INIT:      //-----------(1)

  15.                        pInfo->Flags =  WM_CF_MOTION_X | WM_CF_MOTION_Y | WM_MOTION_MANAGE_BY_WINDOW;

  16.                        pInfo->SnapY = 1;

  17.                        pInfo->SnapX = 1;

  18.                        break;



  19.                    case WM_MOTION_MOVE:  //-----------(2)

  20.                        pPara->FinalMove = pInfo->FinalMove;

  21.                         /* Y轴方向,上下滑动 */

  22.                        if(g_Flag->ucMotionXY == 0)

  23.                        {

  24.                             if(pInfo->pState->Pressed == 1)

  25.                             {

  26.                                 

  27.                             }

  28.                        }

  29.                        /* X轴方向,左右滑动 */

  30.                        else

  31.                        {

  32.                             if(pInfo->pState->Pressed == 1)

  33.                             {

  34.                             }

  35.                        }



  36.                        /* 更新当前的数据位置的箭头 */

  37.                        g_Flag->ucWaveRefresh = 1;

  38.                        break;



  39.                    case WM_MOTION_GETPOS:   //-----------(3)

  40.                        pInfo->yPos = pPara->iCH1Pos;

  41.                        //pInfo->xPos = pPara->iCH1Pos;

  42.                        break;

  43.               }

  44.               break;

  45.      }

  46. }
复制代码
滑动功能实现的关键就在这个WM_MOTION消息里面。
1.      WM_MOTION_INIT消息
    在初始化消息里面设置pInfo->Flags来使能水平滑动和垂直滑动,并且通过标志WM_MOTION_MANAGE_BY_WINDOW使能窗口管理器来管理Motion功能。标志pInfo->SnapY和pInfo->SnapX是用来设置滑动停止后的栅格区域,详情看7.2小节中函数WM_MOTION_SetDefaultPeriod的作用说明。
2.      WM_MOTION_MOVE消息
    这个消息在二代示波器中的使用比较简单,主要是判断是否按下,然后根据按下的位置设置波形的水平或者上下移动即可。当前按下的位置在参数pInfo->pState->x和pInfo->pState->y里面。实际的波形更新是通过设置标志g_Flag->ucWaveRefresh = 1实现的。
3.      WM_MOTION_GETPOS消息
    这个消息未用到,用于获取按下的位置。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2018-6-29 15:37:35 | 显示全部楼层
7.4  总结
    关于滑动的实现,关键的知识点就这么多,需要大家实际操作下,有个深入的认识。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2022-7-1 10:35:55 | 显示全部楼层
链接有问题,楼主有新的吗
回复

使用道具 举报

0

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2022-8-26 14:01:20
在你的生命中,不要让别人来告诉你,你做不到。如果你有一个梦想,并对它满怀激情,你一定要保护它。当别人做不到一件事实,他们就会告诉你 你也做不到;但这不是事实。别人的永远都不会绝对发生在你身上。
幸运飞艇走势图福彩双色球走势图幸运时时彩走势图

0

主题

0

回帖

0

积分

新手上路

积分
0
发表于 2023-1-28 21:11:24
真人娛樂城最有名的是撲克牌遊戲,亦是賭場中常見的賭博遊戲之一

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 13:21 , Processed in 0.188009 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表