硬汉嵌入式论坛

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

[ThreadX全家桶] 学习 guix 的几个经验

[复制链接]

15

主题

87

回帖

132

积分

初级会员

积分
132
发表于 2021-9-24 08:36:07 | 显示全部楼层 |阅读模式
1.按键功能的回调 函数是在 touch release 处理的,不是 pen down,pen down 只是刷新按钮的状态,   在发送消息时如果 release 的坐标值不在控件上,按钮无效,不会响应

2.自带的电阻屏驱动是阻塞的,应用时要注意,可以改造为不阻塞的。

3.自己改造电阻屏校准程序时,可以采用裸机思维,只要定义一个 draw_rect 函数,背景采用这个函数填充背景,再用这个函数画一个图标
4.底层的绘图驱动是画水平线,垂直线,画点,如果芯片带有 dma-2d 可以自己定义这个函数,在初始化时替换为自己的定义的函数指针,
   这样在画布上绘图速度会加快。
5.所有控件都有焦点功能,可以在做界面时不勾选,
6.自定义事件在发送时要指定目标 widget ,否则事件处理不了,会返回到根窗口。
7.除了根窗口,其它窗口在创建时后两个参数可以为空
     gx_studio_named_widget_create("home", GX_NULL, GX_NULL);
  gx_studio_named_widget_create("main_form", GX_NULL, GX_NULL);
  gx_studio_named_widget_create("setup", GX_NULL, GX_NULL);
  gx_studio_named_widget_create("sys_setup", GX_NULL, GX_NULL);
  gx_studio_named_widget_create("touch_calib", GX_NULL, GX_NULL);

  gx_studio_named_widget_create("sys_init", (GX_WIDGET *)root, (GX_WIDGET **)&screen_sys_init);

8. 为了避免触发干扰,电阻屏校准程序可以在每个点读取后加延时,完成程序如下:
   UINT touch_drv_calibrate(_touch_drv_def *touch)
{
    GX_EVENT calibration_event = {0};

    GX_POINT raw_point[4];
    GX_POINT dis_point[4];

    int icon_size;
    GX_RECTANGLE newsize;
    uint8_t (*pen_down)(VOID);

    if(touch->dis_dev == 0)
        {return GX_FAILURE;}

    _tft_str_dis_def *dis_dev = touch->dis_dev;
    pen_down = touch -> pen_down_detect;

    //设置4个显示图标坐标点
    dis_point[0].gx_point_x = dis_dev->dis_width / 10;
    dis_point[0].gx_point_y = dis_dev->dis_height / 10;

    dis_point[1].gx_point_x = dis_dev->dis_width * 9 / 10;
    dis_point[1].gx_point_y = dis_dev->dis_height / 10;

    dis_point[2].gx_point_x = dis_dev->dis_width / 10;
    dis_point[2].gx_point_y = dis_dev->dis_height *9 / 10;

    dis_point[3].gx_point_x = dis_dev->dis_width * 9 / 10;
    dis_point[3].gx_point_y = dis_dev->dis_height *9 / 10;

    //等待触摸松开

    //清屏为蓝色
    draw_rect(touch->dis_dev, 0 ,0 ,dis_dev->dis_width , dis_dev->dis_height , 200>>3 );

    //显示一个10*10 红色标志
    draw_rect(touch->dis_dev, dis_point[0].gx_point_x - 5 , dis_point[0].gx_point_y -5 , dis_point[0].gx_point_x + 5 , dis_point[0].gx_point_y + 5 , (200>>3)<<11 );
    dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.1 point");

    touch_wait_for_no_touch(touch);
    //
    GX_TOUCH_TASK_SLEEP(200);

    /*  wait for a touch: */
    while(1)
    {
        touch_wait_for_touch(touch);

        if (touch_sample_read(touch, &raw_point[0]))
        {
           //清除10*10 红色标志
            draw_rect(touch->dis_dev, dis_point[0].gx_point_x - 5 , dis_point[0].gx_point_y -5 , dis_point[0].gx_point_x + 5 , dis_point[0].gx_point_y + 5, (200>>3) );
            break;
        }
        GX_TOUCH_TASK_SLEEP(1);
    }

    //读取点后,要等待 300 mS ,否则容易误触发
    GX_TOUCH_TASK_SLEEP(300);

    //显示一个10*10 红色标志
    dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.2 point");
    draw_rect(touch->dis_dev, dis_point[1].gx_point_x - 5 , dis_point[1].gx_point_y -5 , dis_point[1].gx_point_x + 5 , dis_point[1].gx_point_y + 5, (200>>3)<<11 );
    /*  wait for a touch: */
    while(1)
    {
        touch_wait_for_touch(touch);
        if (touch_sample_read(touch, &raw_point[1]))
        {
           draw_rect(touch->dis_dev, dis_point[1].gx_point_x - 5 , dis_point[1].gx_point_y -5 , dis_point[1].gx_point_x + 5 , dis_point[1].gx_point_y + 5, (200>>3));
            break;
        }
        GX_TOUCH_TASK_SLEEP(1);
    }

    touch_wait_for_no_touch(touch);
    GX_TOUCH_TASK_SLEEP(300);


    dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.3 point");
    draw_rect(touch->dis_dev, dis_point[2].gx_point_x - 5 , dis_point[2].gx_point_y -5 , dis_point[2].gx_point_x + 5 , dis_point[2].gx_point_y + 5, (200>>3)<<11 );
    /*  wait for a touch: */
    while(1)
    {
        touch_wait_for_touch(touch);

        if (touch_sample_read(touch, &raw_point[2]))
        {
            draw_rect(touch->dis_dev, dis_point[2].gx_point_x - 5 , dis_point[2].gx_point_y -5 , dis_point[2].gx_point_x + 5 , dis_point[2].gx_point_y + 5, (200>>3));
            break;
        }
        GX_TOUCH_TASK_SLEEP(1);
    }


    touch_wait_for_no_touch(touch);
    GX_TOUCH_TASK_SLEEP(300);

    dis_string(dis_dev , dis_dev->dis_width /8 , dis_dev->dis_height/2, 0xffff, "touch No.4 point");
    draw_rect(touch->dis_dev, dis_point[3].gx_point_x - 5 , dis_point[3].gx_point_y -5 , dis_point[3].gx_point_x + 5 , dis_point[3].gx_point_y + 5, (200>>3)<<11 );
    /* wait for a touch: */
    while(1)
    {
        touch_wait_for_touch(touch);
        if (touch_sample_read(touch, &raw_point[3]))
        {
            draw_rect(touch->dis_dev, dis_point[3].gx_point_x - 5 , dis_point[3].gx_point_y -5 , dis_point[3].gx_point_x + 5 , dis_point[3].gx_point_y + 5, (200>>3));
            break;
        }
        GX_TOUCH_TASK_SLEEP(1);
    }

    touch_wait_for_no_touch(touch);

    /* Initialize touch screen calibration factor matrix with new values  */
    if(GX_SUCCESS == touch_calibration_calculate(touch,
                         (GX_POINT *) &dis_point[0],   /* Display coordinates   */
                         (GX_POINT *) &raw_point[0]))             /* Touch coordinates     */

    {

      touch -> calibrated = GX_TRUE;
    //产生校正结束事件
      calibration_event.gx_event_type = GX_EVENT_TOUCH_CALIBRATION_COMPLETE;
      calibration_event.gx_event_target = 0;
      calibration_event.gx_event_sender = 0;
      calibration_event.gx_event_display_handle = 0;

      _gx_system_event_send(&calibration_event);
      return GX_SUCCESS;
    }
    else
    {
      return GX_FAILURE;
    }
}


回复

使用道具 举报

15

主题

87

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2021-9-24 08:38:46 | 显示全部楼层
跟硬件相关的函数都采用函数指针,方便不同的方案使用
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115812
QQ
发表于 2021-9-24 09:19:17 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

36

主题

2050

回帖

2158

积分

至尊会员

积分
2158
发表于 2021-9-24 15:37:29 | 显示全部楼层
很有价值的分享
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

2

主题

65

回帖

71

积分

初级会员

积分
71
发表于 2021-9-30 16:21:06 | 显示全部楼层
guix如果界面太多,每个界面按钮很多的话,需要的代码太多了。。。工程量很大。。这是个缺点
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 05:13 , Processed in 0.265894 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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