硬汉嵌入式论坛

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

[emWin] emwin多功能仪表的问题

[复制链接]

5

主题

4

回帖

19

积分

新手上路

积分
19
发表于 2023-2-18 20:12:29 | 显示全部楼层 |阅读模式
由于学习需要,非常需要用emwin制作一个汽车仪表盘,看了多功能仪表盘的例子,看了半个月了,真的看不懂,首先SCALE那些结构体表示什么意思不知道,还有在转动指针时的_MoveNeedle了的void _MoveNeedle(NEEDLE* pObj, int Index)
{
        GUI_RECT rOld;
        GUI_RECT rNew;
        int      Dif;
        int      Time;

        if (pObj->NeedleUPM)
        {
                _GetNeedleRect(&_Scale[Index], Index, &rOld);
                Time = GUI_GetTime();为什么用到时间?
                Dif = (Time - pObj->NeedlePrevTime) / (60000 / pObj->NeedleUPM / 720);这个公式的含义是什么不是很理解?
                if (Dif != 0)
                {
                        pObj->NeedlePos += (Dif * pObj->NeedleDir);
                        if (pObj->NeedlePos > NEEDLE_GRAD)
                        {
                                pObj->NeedlePos = NEEDLE_GRAD;
                                pObj->NeedleDir = -pObj->NeedleDir;
                        }
                        else
                        {
                                if (pObj->NeedlePos < 0)
                                {
                                        pObj->NeedlePos = 0;
                                        pObj->NeedleDir = -pObj->NeedleDir;
                                }
                        }
                       
                        _GetNeedleRect(&_Scale[Index], Index, &rNew);
                        _MergeRects(&rNew, &rOld);
                        WM_InvalidateRect(_Scale[Index].hWin, &rNew);
                        pObj->NeedlePrevTime = Time;
                }
        }
}
以及如下的结构体每个表示的含义特别是标红的几处不是很理解
typedef struct {
  int x;
  int y;
  int x0;
  int y0;
  int ArcStart;
  int ArcEnd;
  int ArcRadius;
  int ArcArea1;
  int ArcArea2;
  int NumMarkLines;
  int NumPitchLines;
  int LineLen1;
  int LineLen2;
  int ArcWidth;
  int GradDist;
  int PenSize1;
  int PenSize2;
  int PenSize3;
  int NeedleType;
  int NeedleRadius;
  int NumStep;
  int NumStart;
  int NumExp;
  int LinePos1;
  int LinePos2;
  int ArcPos;
  int AxisRadius;
  int TextDist;
  U16 Flags;
  WM_HWIN hWin;
  GUI_MEMDEV_Handle hMemDev;
  char acText[33];
  const GUI_BITMAP* pBitmap;
  int BitmapY;
  COLOR Color[7];
} SCALE;

typedef struct {
int NeedlePos;
  int NeedleUPM;
  int NeedleDir;
  int NeedlePrevTime;
} NEEDLE;

哪位大哥教教我,被搞疯了,又或者不用这个,重新自己画一个仪表盘?不知是否可行。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-2-20 03:54:54 | 显示全部楼层
这个时钟表盘的例子比较好理解,可以看看

【已经发布】整理一期漂亮的时钟表盘例子,之前的不够炫酷
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111420


回复

使用道具 举报

4

主题

29

回帖

41

积分

新手上路

积分
41
发表于 2023-3-12 00:45:02 | 显示全部楼层
最近我也在看这个。确实复杂。上面的_MoveNeedle就是为演示设计的。下面是我修改,根据输入参数,调整指针位置的函数
void _MoveNeedle(NEEDLE* pObj, int Index,int displaments)
{
        GUI_RECT rOld;
        GUI_RECT rNew;
  
  if (pObj->NeedleUPM)
{
    _GetNeedleRect(&_Scale[Index], Index, &rOld);
   
    //NEEDLE_GRAD     - 表盘最大数值
    //pObj->NeedlePos - 指针要指向的刻度
    //400                    - 输入变量displaments最大值
    pObj->NeedlePos = displaments*NEEDLE_GRAD/400;   
   
    if (pObj->NeedlePos > NEEDLE_GRAD)              
    {
      pObj->NeedlePos = NEEDLE_GRAD;                //超过最大值,置最大值
    }
    else  
    {
      if (pObj->NeedlePos < 0)
      {
        pObj->NeedlePos = 0;                        //移动值小于0,置0
      }
    }
    _GetNeedleRect(&_Scale[Index], Index, &rNew);
    _MergeRects(&rNew, &rOld);
    WM_InvalidateRect(_Scale[Index].hWin, &rNew);
  }
}  

我有个不明白划分不同颜色区域的四个参数
  int ArcStart;
  int ArcEnd;
  int ArcArea1;
  int ArcArea2;
ArcStart、ArcEnd是角度值,ArcArea1、ArcArea2是如何设置的。硬汉例子中设置为257、311,在ArcStart(59)、ArcEnd(225)之外,理解不了
楼主清楚吗?请解释一下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106913
QQ
发表于 2023-3-12 02:09:26 | 显示全部楼层
njsssmq 发表于 2023-3-12 00:45
最近我也在看这个。确实复杂。上面的_MoveNeedle就是为演示设计的。下面是我修改,根据输入参数,调整指针 ...

参考我二楼搞,简单易实现,之前搞得太麻烦了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 21:12 , Processed in 0.152561 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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