Page 1 of 1

Do any guage templates exist? [SOLVED]

Posted: Sat Jun 08, 2024 8:07 pm
by Logansfury
Hello everyone,

I wanted to make a few stand-alone circular graph gauges for showing single readouts like gpu temperature, core 0 temp, core 3 temp etc etc

I tried editing an existing conky I downloaded that has circle graphs but in trying to isolate a single graph I broke it. I am going to try again after some sleep but before I do, are there any templets/tutorials for making these kinds of gauges? I did some googling but didn't get any good hits.

Thanks for reading,

Logan

Re: Do any guage templates exist?

Posted: Sun Jun 09, 2024 10:42 pm
by Koentje
Something like this?

single_ring.lua

Code: Select all

--==============================================================================
--                            seamod_rings.lua
--
--  Date    : 05/02/2012
--  Author  : SeaJey
--  Version : v0.1
--  License : Distributed under the terms of GNU GPL version 2 or later
--
--  This version is a modification of lunatico_rings.lua wich is modification of conky_orange.lua
--
--  conky_orange.lua:    http://gnome-look.org/content/show.php?content=137503&forumpage=0
--  lunatico_rings.lua:  http://gnome-look.org/content/show.php?content=142884
--
--  Modified by Koentje for usage with fan rpm
--
--==============================================================================

require 'cairo'

--------------------------------------------------------------------------------
--                                                                    gauge DATA
gauge = {
{
    name='cpu 0',               arg='',
    max_value=110,                 max_rpm=100,
    x=50,                          y=50,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=180,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0xFFEEEE,      graph_bg_alpha=0.1,
    graph_fg_colour=0xFFFFFF,      graph_fg_alpha=0.4,
    hand_fg_colour=0xEF5A29,       hand_fg_alpha=1.0,
    txt_radius=0,
    txt_weight=1,                  txt_size=23.0,
    txt_fg_colour=0x00d0FF,        txt_fg_alpha=1.0,
    graduation_radius=14,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='CPU 0',
    caption_weight=1,              caption_size=14,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=100,
},
}

-------------------------------------------------------------------------------
--                                                                 rgb_to_r_g_b
-- converts color in hexa to decimal
--
function rgb_to_r_g_b(colour, alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

-------------------------------------------------------------------------------
--                                                            angle_to_position
-- convert degree to rad and rotate (0 degree is top/north)
--
function angle_to_position(start_angle, current_angle)
    local pos = current_angle + start_angle
    return ( ( pos * (2 * math.pi / 360) ) - (math.pi / 2) )
end


-------------------------------------------------------------------------------
--                                                              draw_gauge_ring
-- displays gauges
--
function draw_gauge_ring(display, data, value)
    local max_value = data['max_value']
	local max_rpm = data['max_rpm']
    local x, y = data['x'], data['y']
    local graph_radius = data['graph_radius']
    local graph_thickness, graph_unit_thickness = data['graph_thickness'], data['graph_unit_thickness']
    local graph_start_angle = data['graph_start_angle']
    local graph_unit_angle = data['graph_unit_angle']
    local graph_bg_colour, graph_bg_alpha = data['graph_bg_colour'], data['graph_bg_alpha']
    local graph_fg_colour, graph_fg_alpha = data['graph_fg_colour'], data['graph_fg_alpha']
    local hand_fg_colour, hand_fg_alpha = data['hand_fg_colour'], data['hand_fg_alpha']
    local graph_end_angle = (max_value * graph_unit_angle) % 360

    -- background ring
    cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, 0), angle_to_position(graph_start_angle, graph_end_angle))
    cairo_set_source_rgba(display, rgb_to_r_g_b(graph_bg_colour, graph_bg_alpha))
    cairo_set_line_width(display, graph_thickness)
    cairo_stroke(display)

    -- arc of value  (calculation of RPM to max_value !!)
    local val = value % (max_value +1)
    local start_arc = 0
    local stop_arc = 0
    local i = 1
    while i <= val do
        start_arc = (graph_unit_angle * i) - graph_unit_thickness
        stop_arc = (graph_unit_angle * i)
        cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
        cairo_set_source_rgba(display, rgb_to_r_g_b(graph_fg_colour, graph_fg_alpha))
        cairo_stroke(display)
        i = i + 1
    end
    local angle = start_arc

    -- hand
    start_arc = (graph_unit_angle * val) - (graph_unit_thickness * 2)
    stop_arc = (graph_unit_angle * val)
    cairo_arc(display, x, y, graph_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
    cairo_set_source_rgba(display, rgb_to_r_g_b(hand_fg_colour, hand_fg_alpha))
    cairo_stroke(display)

    -- graduations marks (fan blades)
    local graduation_radius = data['graduation_radius']
    local graduation_thickness, graduation_mark_thickness = data['graduation_thickness'], data['graduation_mark_thickness']
    local graduation_unit_angle = data['graduation_unit_angle']
    local graduation_fg_colour, graduation_fg_alpha = data['graduation_fg_colour'], data['graduation_fg_alpha']
    if graduation_radius > 0 and graduation_thickness > 0 and graduation_unit_angle > 0 then
        local nb_graduation = graph_end_angle / graduation_unit_angle
        local i = 0
        while i < nb_graduation do
            cairo_set_line_width(display, graduation_thickness)
            start_arc = (graduation_unit_angle * i) - (graduation_mark_thickness / 2)
            stop_arc = (graduation_unit_angle * i) + (graduation_mark_thickness / 2)
            cairo_arc(display, x, y, graduation_radius, angle_to_position(graph_start_angle, start_arc), angle_to_position(graph_start_angle, stop_arc))
            cairo_set_source_rgba(display,rgb_to_r_g_b(graduation_fg_colour,graduation_fg_alpha))
            cairo_stroke(display)
            cairo_set_line_width(display, graph_thickness)
            i = i + 1
        end
    end

    -- text (rpm value)
    local txt_radius = data['txt_radius']
    local txt_weight, txt_size = data['txt_weight'], data['txt_size']
    local txt_fg_colour, txt_fg_alpha = data['txt_fg_colour'], data['txt_fg_alpha']
        local str, value = 0, 0
	local str, rpm
        str = string.format('${%s %s}', data['name'], data['arg'])
        str = conky_parse(str) --input rpm fans
        value = tonumber(str)  -- rpm fans
    cairo_select_font_face (display, "ani", CAIRO_FONT_SLANT_NORMAL, txt_weight)
    cairo_set_font_size (display, txt_size)
    cairo_set_source_rgba (display, rgb_to_r_g_b(txt_fg_colour, txt_fg_alpha))
   -- bad hack but not enough time !
    if value >= 2000 then cairo_move_to (display, x - ((1.3 * txt_size) - 1), y + (0.5 * txt_size) - 3) end
     if value <= 1999 then cairo_move_to (display, x - ((1.3 * txt_size) + 2), y + (0.5 * txt_size) - 3) end
      if value <= 999 then cairo_move_to (display, x - ((1.2 * txt_size) - 6), y + (0.5 * txt_size) - 3) end
       if value <= 199 then cairo_move_to (display, x - ((1.2 * txt_size) - 3), y + (0.5 * txt_size) - 3) end
        if value <= 99 then cairo_move_to (display, x - ((1.2 * txt_size) - 17), y + (0.5 * txt_size) - 3) end
         if value <= 9 then cairo_move_to (display, x - ((1.1 * txt_size) - 20), y + (0.5 * txt_size) - 3) end
         --                                change theses values to center!  ^^
         cairo_show_text (display, value)
         cairo_stroke (display)

    -- caption (fan name)
    local caption = data['caption']
    local caption_weight, caption_size = data['caption_weight'], data['caption_size']
    local caption_fg_colour, caption_fg_alpha = data['caption_fg_colour'], data['caption_fg_alpha']
    local tox = graph_radius * (math.cos((graph_start_angle * 2 * math.pi / 360)-(math.pi/2)))
    local toy = graph_radius * (math.sin((graph_start_angle * 2 * math.pi / 360)-(math.pi/2))) + 5
    cairo_select_font_face (display, "ubuntu", CAIRO_FONT_SLANT_NORMAL, caption_weight);
    cairo_set_font_size (display, caption_size)
    cairo_set_source_rgba (display, rgb_to_r_g_b(caption_fg_colour, caption_fg_alpha))
    cairo_move_to (display, x + tox + 5, y + toy + 1)
    -- really bad hack but not enough time !
    if graph_start_angle < 105 then
        cairo_move_to (display, x + tox - 30, y + toy + 1)
    end
    cairo_show_text (display, caption) -- caption
    cairo_stroke (display)
end


-------------------------------------------------------------------------------
--                                                               go_gauge_rings
-- loads data and displays gauges
--
function go_gauge_rings(display)
    local function load_gauge_rings(display, data)
        local str, value = 0, 0
		local str, rpm
    	local max_value = data['max_value']
		local max_rpm = data['max_rpm']
        str = string.format('${%s %s}', data['name'], data['arg'])
        str = conky_parse(str) --rpm fans
        value = tonumber(str)  -- rpm fans
		rpm = (value / max_rpm * max_value)
		rpm = string.format ("%.f", rpm)

        draw_gauge_ring(display, data, rpm)
    end

    for i in pairs(gauge) do
        load_gauge_rings(display, gauge[i])
    end
end

-------------------------------------------------------------------------------
--                                                                         MAIN
function conky_main()
    if conky_window == nil then
        return
    end

    local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
    local display = cairo_create(cs)

    local updates = conky_parse('${updates}')
    update_num = tonumber(updates)

    if update_num > 0 then
        go_gauge_rings(display)
    end

    cairo_surface_destroy(cs)
    cairo_destroy(display)

end


Put this in your conky script:

Code: Select all

	lua_load = 'single_ring.lua',
	lua_draw_hook_post = 'main',

Re: Do any guage templates exist?

Posted: Mon Jun 10, 2024 1:28 am
by Logansfury
WooHoooo!

Hey Koentje :)

Fantastic thank you, I am going to take this and see what I can learn about ring graphs.

Re: Do any guage templates exist?

Posted: Mon Jun 10, 2024 1:54 am
by Logansfury
Hey Koentje,

What is this example ring tracking? I see you have marked it CPU0, there is a max rpm=100 and have a fan blades bg in the guage, but my numbers are jumping between 35 and 99. Is this 1/100th of the CPU fan speed?

This is an awesome little gauge, it looks great!

Re: Do any guage templates exist?

Posted: Mon Jun 10, 2024 7:26 am
by Koentje
Logansfury wrote: Mon Jun 10, 2024 1:54 am What is this example ring tracking? I see you have marked it CPU0,
Mmh.. lemme think... cpu 0... mmh.... what could it be tracking..? :roll:
Btw if cpu 0 is jumping to 99% the cpu is getting kicked pretty well by something.
there is a max rpm=100
That is max value of the object. I use this script for my fans, so if a fan rotate at a max speed of 2000, then max_rpm should be 2000.
If max_rpm is a higher number, then the ring will never be maxed out. If the number is lower, then the ring maxed out and starts over..
...and have a fan blades bg in the guage
set graduation_radius= to 0 and blades are gone.
...but my numbers are jumping between 35 and 99. Is this 1/100th of the CPU fan speed?
CPU %


max_value= is the circle of the ring. 127 is a full circle. So if you leave caption blank and set it this to 127 you get a full circle.

name= and arg= are the object and argument you want the circle to display.
name='memperc' shows memory percentage.
name='exec' and arg='cat /somedir/somefile' shows a value that somefile holds.

Re: Do any guage templates exist?

Posted: Mon Jun 10, 2024 2:28 pm
by Logansfury
Great info, thank you :)

Re: Do any guage templates exist?

Posted: Tue Jun 11, 2024 12:46 am
by Logansfury
I am working on getting a copy of this guage edited to what I want for my display:

Image

I have my start and end points, but need to know how to adjust the other setting to keep accuracy. I was just at 85% and the progress bar was maxed out as if it were at 100.

Can the gauge number be displayed with a percentage sign?

Here is my edit of the .lua:

Code: Select all

gauge = {
{
    name='cpu 0',               arg='',
    max_value=95,                 max_rpm=100,
    x=50,                          y=50,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=225,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0xFFEEEE,      graph_bg_alpha=0.1,
    graph_fg_colour=0xFFFFFF,      graph_fg_alpha=1.0,
    hand_fg_colour=0xFFFFFF,       hand_fg_alpha=1.0,
    txt_radius=0,
    txt_weight=1,                  txt_size=23.0,
    txt_fg_colour=0xFFFFFF,        txt_fg_alpha=1.0,
    font_txt='Neon 80s',
    graduation_radius=0,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    font_caption='Droid Sans',
    caption='CPU 0',
    caption_weight=1,              caption_size=14,
    caption_fg_colour=0xFFFFFF,    caption_fg_alpha=100,
},

Re: Do any guage templates exist?

Posted: Tue Jun 11, 2024 12:48 am
by Logansfury
Hmmmmmmmmmmm

something is hammering the hell out of my cpu, its reading 98/100

but the good news is the gauge seems to have aligned itself to my edits, the 98 was exactly where it should have been on the indicator