sysライブラリ
sysライブラリのインターフェース関数については、sysインターフェース関数を参照してください。
一、sys.taskInit(func, arg1, arg2, argN)
タスク(コルーチン)を作成します。
パラメータ:
- function: 実行する関数。匿名関数、ローカル関数、またはグローバル関数を指定できます。
- any: 渡す引数1(任意)
- any: 渡す引数2(任意)
- any: 渡す引数N(任意)
例:
-- LuaToolsはPROJECTとVERSION情報を必要とします
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
-- 関数と引数を指定してタスクを開始
sys.taskInit(function(name, delay)
sys.wait(delay)
print("タスク", name, "が実行されました")
end, "サンプル1", 2000)
-- 引数なしでタスクを開始
sys.taskInit(function()
print("引数なしのタスクが実行されました")
end)
sys.run()
どちらの方法でも使用可能です。引数は要件に応じて省略できます。
二、sys.timerStart(func, timeout, arg1, arg2, argN)
タイマーを作成します。この関数内では `sys.waitXXX` を使用できません。
例:
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
-- 1000ミリ秒後にメッセージを表示するタイマー
sys.timerStart(function(msg)
print("タイマーがトリガーされました:", msg)
end, 1000, "こんにちは")
-- 5000ミリ秒後にメッセージを表示するタイマー
sys.timerStart(function()
print("5秒経過しました")
end, 5000)
sys.run()
タイマーの間隔に注意してください。
三、sys.subscribe(topic, func), sys.publish(topic, arg1, arg2, argN)
特定のトピックチャネルを購読し、メッセージを発行します。
例:
-- LuaToolsはPROJECTとVERSION情報を必要とします
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
-- センサーデータ更新のコールバック関数
local function sensor_callback(data)
print("センサー更新受信:", data)
end
-- トピックを購読
sys.subscribe("SENSOR_UPDATE", sensor_callback)
-- トピックにメッセージを発行
sys.publish("SENSOR_UPDATE", {temp=25, humidity=60})
-- 別の購読者
sys.subscribe("SENSOR_UPDATE", function(data)
print("別の購読者: センサー更新受信", data.temp)
end)
sys.run()
四、sys.waitUntil(topic, timeout)
タスクは指定された時間または特定のトピックメッセージを待ちます。
例:
-- LuaToolsはPROJECTとVERSION情報を必要とします
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
sys.taskInit(function()
print("待機は不要です")
sys.waitUntil("DATA_READY", 5000)
print("メッセージを受信しました")
end)
sys.taskInit(function()
sys.wait(3000)
sys.publish("DATA_READY")
print("メッセージを発行")
end)
sys.run()
上記の例では、`sys.waitUntil` の前の文が先に表示され、3秒後にメッセージが発行されると、`sys.waitUntil` がメッセージを検出して、次の文が実行されます。
例 (タイムアウト):
-- LuaToolsはPROJECTとVERSION情報を必要とします
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
sys.taskInit(function()
print("待機は不要です")
sys.waitUntil("DATA_READY", 5000)
print("メッセージを受信しませんでした(タイムアウト)")
end)
sys.taskInit(function()
sys.wait(10000)
sys.publish("DATA_READY")
print("メッセージを発行")
end)
sys.run()
タイムアウト期間が終了してもメッセージが発行されない場合、次のコードが自動的に実行されます。
`sys.waitUntil` の戻り値をキャッチしてみてください。例: `local result, data = sys.waitUntil("test", 3000)`
五、sys.timerLoopStart(func, timeout, arg1, arg2, argN)
ループタイマーを作成します。この関数内では `sys.waitXXX` を使用できません。
例:
PROJECT = "AIR_780eg"
VERSION = "1.0.0"
_G.sys = require("sys")
-- 1000ミリ秒ごとに実行されるループタイマー
sys.timerLoopStart(function()
print("ループタイマー:", os.time())
end, 1000)
-- 別のタスク
sys.taskInit(function()
sys.waitUntil("SYSTEM_READY", 1000) -- この行は省略可能
local counter = 0
while true do
sys.wait(2000) -- 2000ミリ秒待機
counter = counter + 1
print("メインタスク: ", counter, "回実行")
end
end)
sys.run()
-- sys.run()の後には何も追加しないでください!!!!!