Files
BQP/docs/ScriptEngine/ExtensionAPIs.md
2026-07-13 09:25:40 +07:00

2.9 KiB

Extension APIs / API Mở rộng

📋 Overview / Tổng quan

Apps implement IScriptResource interface để expose custom APIs cho scripts.

🔌 IScriptResource Interface

classDiagram
    class IScriptResource {
        <<interface>>
        +Type AppGlobalType
        +GetTaskGlobals() IDictionary
        +GetMissionGlobals(id, ct) IDictionary
        +UsingNamespaces ImmutableArray~string~
        +Modules ImmutableArray~string~
    }

    class RobotScriptResource {
        +AppGlobalType: typeof(RobotGlobals)
        +GetTaskGlobals()
        +GetMissionGlobals()
    }

    class FleetScriptResource {
        +AppGlobalType: typeof(FleetGlobals)
        +GetTaskGlobals()
        +GetMissionGlobals()
    }

    class RobotGlobals {
        +MoveTo(x, y) Task
        +GetBatteryLevel() double
        +IsMoving() bool
    }

    class FleetGlobals {
        +GetAvailableRobots() List~Robot~
        +SendOrder(serial, order) Task
        +GetRobotState(serial) RobotState
    }

    IScriptResource <|-- RobotScriptResource
    IScriptResource <|-- FleetScriptResource
    RobotScriptResource ..> RobotGlobals: exposes
    FleetScriptResource ..> FleetGlobals: exposes

🤖 RobotApp Example

Define AppGlobalType:

public class RobotScriptGlobals
{
    public Task MoveTo(double x, double y) { }
    public double GetBatteryLevel() { }
    public bool IsMoving() { }
}

Use in Script:

[Task(Interval = 5000)]
public async Task CheckBattery()
{
    var level = Robot.GetBatteryLevel();
    Logger.Info($"Battery: {level}%");

    if (level < 20.0)
    {
        await Robot.MoveTo(0, 0); // Home position
    }
}

🏭 FleetManager Example

Define AppGlobalType:

public class FleetScriptGlobals
{
    public List<Robot> GetAvailableRobots() { }
    public Task SendOrder(string robotSerial, Order order) { }
    public RobotState GetRobotState(string robotSerial) { }
    public Task MoveToNode(string robotSerial, string nodeId) { }
    public Task MoveToStation(string robotSerial, string stationId) { }
}

Use in Script:

[Task(Interval = 10000)]
public void MonitorFleet()
{
    var robots = Fleet.GetAvailableRobots();
    foreach (var robot in robots)
    {
        var state = Fleet.GetRobotState(robot.SerialNumber);
        if (state?.BatteryCharge < 20.0)
        {
            Logger.Warning($"Robot {robot.SerialNumber} low battery");
        }
    }
}

Last Updated: 2025-11-13