// ========================================
// UCCNC Modbus -> Overrides
// ========================================

// -------- AKTIVERING + REGISTERVAL --------
const bool ENABLE_FRO = true;
const bool ENABLE_SRO = true;
const bool ENABLE_JOG = true;

const int REG_FRO = 40;   // Modbus register för FRO
const int REG_JOG = 41;   // Modbus register för Jog rate
const int REG_SRO = 42;   // Modbus register för Spindle override

// -------- FIELDS --------
const int FIELD_FRO = 232; // FRODRO
const int FIELD_SRO = 233; // SRODRO
const int FIELD_JOG = 913; // Jogfeedrate (0-100% i JogSettings)

// -------- SKALNING RÅVÄRDE --------
const double RAW_MIN = 0.0;
const double RAW_MAX = 10000.0;

// -------- UTVÄRDES-SPANN --------
const int FRO_MIN = 0;
const int FRO_MAX = 300;

const int SRO_MIN = 0;
const int SRO_MAX = 300;

const int JOG_MIN = 0;   // 0%
const int JOG_MAX = 100; // 100%

// ========================================
// Hjälpfunktioner
// ========================================
Func<int, string, int?> ReadReg = (reg, name) =>
{
    ushort raw;
    if (!exec.GetModbusregister(reg, out raw))
    {
        exec.AddStatusmessage("MODBUS: kunde inte läsa register " + reg + " (" + name + ")");
        return null;
    }
    return (int)raw;
};

Func<int, int, int, int> ScaleToInt = (raw, outMin, outMax) =>
{
    // Clamp råvärde
    double r = raw;
    if (r < RAW_MIN) r = RAW_MIN;
    if (r > RAW_MAX) r = RAW_MAX;

    // Skala linjärt till heltal
    int v = (int)Math.Round(
        outMin + (r - RAW_MIN) * (outMax - outMin) / (RAW_MAX - RAW_MIN)
    );

    // Clamp utvärde
    if (v < outMin) v = outMin;
    if (v > outMax) v = outMax;

    return v;
};

// ========================================
// FRO
// ========================================
if (ENABLE_FRO)
{
    var raw = ReadReg(REG_FRO, "FRO");
    if (raw == null) return;

    int froPercent = ScaleToInt(raw.Value, FRO_MIN, FRO_MAX);
    AS3.Setfield(froPercent, FIELD_FRO);
    AS3.Validatefield(FIELD_FRO);
}

// ========================================
// SRO
// ========================================
if (ENABLE_SRO)
{
    var raw = ReadReg(REG_SRO, "SRO");
    if (raw == null) return;

    int sroPercent = ScaleToInt(raw.Value, SRO_MIN, SRO_MAX);
    AS3.Setfield(sroPercent, FIELD_SRO);
    AS3.Validatefield(FIELD_SRO);
}

// ========================================
// JOG RATE (JogSettings)
// ========================================
if (ENABLE_JOG)
{
    var raw = ReadReg(REG_JOG, "JOG");
    if (raw == null) return;

    int jogPercent = ScaleToInt(raw.Value, JOG_MIN, JOG_MAX);

    // JogSettings-fält brukar kräva AS3jog + text
    AS3jog.Setfieldtext(jogPercent.ToString(), FIELD_JOG);
    AS3jog.Validatefield(FIELD_JOG);
}
