I see, I think in this case using custom easing may be what you are looking for. You could essentially control the speed of each element (rotation and fill angle) of gui.animate() over the set time.
Looks like gui.EASING_INSINE is close to what you need. Also custom easing is the proper way to do but if you just need loop base on your solution then you can put it in timer.delay to check if it’s done one round then start animation again.
It was an example. You can replace the callback with a recursive function, that always calls the animation, with the callback function again, with new parameters. E.g.
function init(self)
local node = ...
local function play_anim()
local angle = ... e.g. calc from self
local duration = ...
gui.animate(node, "fill_angle", angle, gui.EASING_LINEAR, duration, 0, play_anim)
end
play_anim()
end