当前位置:网站首页>[luatos-air551g] 6.2 repair: restart caused by line drawing

[luatos-air551g] 6.2 repair: restart caused by line drawing

2022-07-06 08:17:00 Birds hate fish

Preface

Solve the problem of drawing the starting and ending points of lines x or y If the coordinates are the same, there will be a restart problem .

problem

[2022-02-12 15:21:18.439] I/user.74	23	69	23
[2022-02-12 15:21:18.455] Guru Meditation Error: Core  0 panic'ed (Store access fault). Exception was unhandled.

[2022-02-12 15:28:01.448] I/user.68	64	64	64
[2022-02-12 15:28:01.448] Guru Meditation Error: Core  0 panic'ed (Store access fault). Exception was unhandled.

[2022-02-12 15:30:12.171] I/user.64	64	58	64
[2022-02-12 15:30:12.202] Guru Meditation Error: Core  0 panic'ed (Store access fault). Exception was unhandled.

When using lcd.drawline() when , If you enter the coordinates x perhaps y identical , Will cause a restart , I don't know how to solve this at present

solve

lcd.drawLine(64,64,59,64,0xf000) Unable to run
lcd.drawLine(59,64,64,64,0xf000) Can run
It seems to be the same x Or the same y It can only be from the point with small coordinate value to the point with large coordinate value .

Just add a function to exchange the positions of two points

--  Used when lcd When drawing lines , The horizontal and vertical coordinates are the same, from small points to large points 
function judge_lcd_xy_same(x1,y1,x2,y2)
    if x1 == x2 then
        if y1>y2 then
            temp = y1
            y1 = y2
            y2 = temp
        end
    end
    if y1 == y2 then
        if x1>x2 then
            temp = x1
            x1 = x2
            x2 = temp
        end
    end
    return x1,y1,x2,y2
    
end

Source code

int luat_lcd_draw_line(luat_lcd_conf_t* conf,uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint32_t color){
    
    uint16_t t;
    uint32_t i = 0;
    int xerr = 0, yerr = 0, delta_x, delta_y, distance;
    int incx, incy, row, col;
    if (x1 == x2 || y1 == y2)
    {
    
        /* fast draw transverse line */
        luat_lcd_set_address(conf,x1, y1, x2, y2);
        size_t dots = (x2 - x1 + 1) * (y2 - y1 + 1);// Number of points 
        uint8_t* line_buf = (uint8_t*)luat_heap_malloc(dots * 2);
        for (i = 0; i < dots; i++)
        {
    
            line_buf[2 * i] = color >> 8;
            line_buf[2 * i + 1] = color;
        }
        luat_gpio_set(conf->pin_dc, Luat_GPIO_HIGH);
        if (conf->port == LUAT_LCD_SPI_DEVICE){
    
            luat_spi_device_send((luat_spi_device_t*)(conf->userdata),  (const char*)line_buf, dots * 2);
        }else{
    
            luat_spi_send(conf->port,  (const char*)line_buf, dots * 2);
        }
        luat_heap_free(line_buf);
        return 0;
    }

    delta_x = x2 - x1;
    delta_y = y2 - y1;
    row = x1;
    col = y1;
    if (delta_x > 0)incx = 1;
    else if (delta_x == 0)incx = 0;
    else
    {
    
        incx = -1;
        delta_x = -delta_x;
    }
    if (delta_y > 0)incy = 1;
    else if (delta_y == 0)incy = 0;
    else
    {
    
        incy = -1;
        delta_y = -delta_y;
    }
    if (delta_x > delta_y)distance = delta_x;
    else distance = delta_y;
    for (t = 0; t <= distance + 1; t++)
    {
    
        luat_lcd_draw_point(conf,row, col,color);
        xerr += delta_x ;
        yerr += delta_y ;
        if (xerr > distance)
        {
    
            xerr -= distance;
            row += incx;
        }
        if (yerr > distance)
        {
    
            yerr -= distance;
            col += incy;
        }
    }
    return 0;
}
原网站

版权声明
本文为[Birds hate fish]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202131832515096.html