Javelin, I've now managed to sort the scales for the gauges using your explanation.
The only issue I see is for the vertical speed indicator. The needle stops rotating when the needle hits +30m/s as expected (or 180 degrees of rotation).
But for negative values, it goes way beyond 180, to something like 210 degrees. The value is bound, so I'm not sure what's happening.
This is the code
{
float
vertical_speed,
angle;
vertical_speed = (metres_per_minute (current_flight_dynamics->world_velocity_y.value) / 60); //convert to metres per second
vertical_speed = bound (vertical_speed, -30.0, 30.0);
//
// non-linear scale
//
// up to 10 m/s, move 80 deg
//
// 10 - 20 m/s, move 60 deg
//
// 20 - 30 m/s, move 40 deg
if (vertical_speed < 10.0)
angle = rad((90 + vertical_speed/10.0) * 80.0);
else if (vertical_speed < 20.0)
angle = rad(80.0 + (vertical_speed - 10.0) * 60.0/10.0);
else
angle = rad(140.0 + (vertical_speed - 20.0) * 40.0/10.0);
search.result_sub_object->relative_roll = -angle;
}