--==============================================================================
--                            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
--
--  2021-02-20 Modified by Koentje for usage with fan rpm (max_rpm)
--  2025-12-25 Modified by Koentje added some extra txt_ options
--
--==============================================================================

require 'cairo'

--------------------------------------------------------------------------------
--                                                                    gauge DATA
gauge = {
{--------------CPU FAN1---------------------------------------------------------
    fname='hwmon nct6687',                  farg='fan 1',
--    fname='exec',                  farg='echo 1550',
    max_value=110,                 max_rpm=1550,
    pos_x=888,                     pos_y=805,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=180,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0x227160,      graph_bg_alpha=0.15,
    graph_fg_colour=0x00bbff,      graph_fg_alpha=0.15,
    hand_fg_colour=0xEF5A29,       hand_fg_alpha=0.8,
    txt_font='LCDMono2',          txt_radius=0,
    txt_weight=0,                  txt_size=28.0,
    txt_fg_colour=0x00d0FF,        txt_fg_alpha=0.6,
    graduation_radius=14,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='CORE1',
    caption_weight=1,              caption_size=11.4,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0.7,
},
{--------------CPU FAN2---------------------------------------------------------
    fname='hwmon nct6687',                  farg='fan 2',
    max_value=110,                 max_rpm=1300,
    pos_x=983,                     pos_y=791,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=180,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0x227160,      graph_bg_alpha=0.15,
    graph_fg_colour=0x00bbff,      graph_fg_alpha=0.15,
    hand_fg_colour=0xEF5A29,       hand_fg_alpha=0.8,
    txt_font='LCDMono2',          txt_radius=0,
    txt_weight=0,                  txt_size=28.0,
    txt_fg_colour=0x00D0FF,        txt_fg_alpha=0.6,
    graduation_radius=14,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='CORE2',
    caption_weight=1,              caption_size=11.4,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0.7,
},
{--------------CPU FAN3---------------------------------------------------------
    fname='hwmon nct6687',                  farg='fan 3',
--    fname='exec',                  farg='echo 1550',
    max_value=110,                 max_rpm=1300,
    pos_x=2509,                     pos_y=792,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=180,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0x227160,      graph_bg_alpha=0.15,
    graph_fg_colour=0x00bbff,      graph_fg_alpha=0.15,
    hand_fg_colour=0xEF5A29,       hand_fg_alpha=0.8,
    txt_font='LCDMono2',          txt_radius=0,
    txt_weight=0,                  txt_size=28.0,
    txt_fg_colour=0x00d0FF,        txt_fg_alpha=0.6,
    graduation_radius=14,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='CORE3',
    caption_weight=1,              caption_size=11.4,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0.7,
},
{--------------CPU FAN4--------------------------------------------------------
    fname='hwmon nct6687',                  farg='fan 4',
    max_value=110,                 max_rpm=5500,
    pos_x=2603,                     pos_y=807,
    graph_radius=35,
    graph_thickness=8,
    graph_start_angle=180,
    graph_unit_angle=2.84,         graph_unit_thickness=2.7,
    graph_bg_colour=0x227160,      graph_bg_alpha=0.15,
    graph_fg_colour=0x00bbff,      graph_fg_alpha=0.15,
    hand_fg_colour=0xEF5A29,       hand_fg_alpha=0.8,
    txt_font='LCDMono2',          txt_radius=0,
    txt_weight=0,                  txt_size=28.0,
    txt_fg_colour=0x00D0FF,        txt_fg_alpha=0.6,
    graduation_radius=14,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='CORE3',
    caption_weight=1,              caption_size=11.4,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0.7,
},
{----------------RADAR----------------------------------------------------------
    fname='exec',                  farg='"./scripts/radar number"',
    max_value=359.9,                max_rpm=360,
    pos_x=2245,                     pos_y=877,
    graph_radius=52,
    graph_thickness=90,
    graph_start_angle=360,
    graph_unit_angle=8,            graph_unit_thickness=15,
    graph_bg_colour=0xff7160,      graph_bg_alpha=0,
    graph_fg_colour=0x00bbff,      graph_fg_alpha=0,
    hand_fg_colour=0x227170,       hand_fg_alpha=.6,
    graduation_radius=0,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=82,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=1,
    skew_x=10,                     skew_y=10,
    txt_font='Digital-7',          txt_radius=0,
    txt_weight=0,                  txt_size=1.0,
    txt_fg_colour=0x00D0FF,        txt_fg_alpha=0,
    caption='',
    caption_weight=1,              caption_size=1,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0,
},
{----------------RADIO VOLUME---------------------------------------------------
    fname='exec',                  farg='cat ./tempfiles/radio | head -n4 | tail -n1',
--    fname='exec',                  farg='echo 100',
    max_value=100,                 max_rpm=100,
    pos_x=240,                     pos_y=1258,
    graph_radius=22,
    graph_thickness=4,
    graph_start_angle=201,
    graph_unit_angle=2.84,         graph_unit_thickness=3,
    graph_bg_colour=0xaaffdd,      graph_bg_alpha=0.10,
    graph_fg_colour=0xaaffdd,      graph_fg_alpha=0.2,
    hand_fg_colour=0xaaffdd,       hand_fg_alpha=0.4,
    txt_font='Digital-7',          txt_radius=0,
    txt_weight=0,                  txt_size=0,
    txt_fg_colour=0x00D0FF,        txt_fg_alpha=0.6,
    graduation_radius=0,
    graduation_thickness=28,       graduation_mark_thickness=29,
    graduation_unit_angle=72,
    graduation_fg_colour=0xAAAAAA, graduation_fg_alpha=0.2,
    caption='',
    caption_weight=1,              caption_size=11.4,
    caption_fg_colour=0xFFA300,    caption_fg_alpha=0.7,
},
}

-------------------------------------------------------------------------------
--                                                                 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, fvalue)
    local max_value = data['max_value']
	local max_rpm = data['max_rpm']
    local pos_x, pos_y = data['pos_x'], data['pos_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, pos_x, pos_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 fvalue  (calculation of RPM to max_value !!)
    local fval = fvalue % (max_value +1)
    local start_arc = 0
    local stop_arc = 0
    local i = 1
    while i <= fval do
        start_arc = (graph_unit_angle * i) - graph_unit_thickness
        stop_arc = (graph_unit_angle * i)
        cairo_arc(display, pos_x, pos_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 * fval) - (graph_unit_thickness * 4)
    stop_arc = (graph_unit_angle * fval)
    cairo_arc(display, pos_x, pos_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, pos_x, pos_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 fvalue)
    local txt_font = data['txt_font']
    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 fstr, fvalue = 0, 0
        local fstr, rpm
        fstr = string.format('${%s %s}', data['fname'], data['farg'])
        fstr = conky_parse(fstr) --input rpm fans
        fvalue = tonumber(fstr)  -- rpm fans
    cairo_select_font_face (display, txt_font, 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 fvalue >= 2000 then cairo_move_to (display, pos_x - ((1.3 * txt_size) - 11),   pos_y + (0.5 * txt_size) - 4) end
     if fvalue <= 1999 then cairo_move_to (display, pos_x - ((1.3 * txt_size) -7),    pos_y + (0.5 * txt_size) - 4) end
      if fvalue <= 999 then cairo_move_to (display, pos_x - ((1.2 * txt_size) - 12),  pos_y + (0.5 * txt_size) - 4) end
       if fvalue <= 199 then cairo_move_to (display, pos_x - ((1.2 * txt_size) - 3),  pos_y + (0.5 * txt_size) - 4) end
        if fvalue <= 99 then cairo_move_to (display, pos_x - ((1.2 * txt_size) - 17), pos_y + (0.5 * txt_size) - 4) end
         if fvalue <= 9 then cairo_move_to (display, pos_x - ((1.1 * txt_size) - 20), pos_y + (0.5 * txt_size) - 4) end
         --                                change theses values to center!  ^^
         cairo_show_text (display, fvalue)
         cairo_stroke (display)

    -- caption (fan fname)
    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, "LCDMono2", 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, pos_x + tox + 5, pos_y + toy + 1)
    -- really bad hack but not enough time !
    if graph_start_angle < 105 then
        cairo_move_to (display, pos_x + tox - 30, pos_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 fstr, fvalue = 0, 0
		local fstr, rpm
    	local max_value = data['max_value']
		local max_rpm = data['max_rpm']
        fstr = string.format('${%s %s}', data['fname'], data['farg'])
        fstr = conky_parse(fstr) --rpm fans
        fvalue = tonumber(fstr)  -- rpm fans
		rpm = (fvalue / 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_rings()
    if conky_window == nil then
        return
    end

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

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

    if update_num > 0 then
        go_gauge_rings(display)
    end

    cairo_surface_destroy(fcs)
    cairo_destroy(display)

end

