見出し画像

TWSNMP FCに計測器のプロトコルLXIのポーリングを追加

今朝は4時半から開発開始です。
昨日、SNMPのポーリングをJavaScriptで行うモードを追加しました。その応用で計測器のプロトコルLXIもJavaScriptから行うモードを作りました。

のような感じです。

ポーリングの種別をLXIにすれば、lxiQuery()という関数が判定スクリプトで使えるようになります。lxiCommand()という関数もつけましたが、応答がズレてしまうので使えません。全部lxiQueryでいけるような気がします。
スクリプトは

var r = lxiQuery("READ?");
setResult("lxi",r);
r && r *1 > 0.0

のような感じです。
LXIは、

コマンドを実行して応答が返らない対策で、JavaScriptの実行環境ottoの機能でタイムアウトするようにしてあります。
こんなコードです。

var errJsHalt = fmt.Errorf("jshalt")

func runJavaScriptWithTimeout(vm *otto.Otto, s string, timeout int) (otto.Value, error) {
	start := time.Now()
	defer func() {
		duration := time.Since(start)
		if caught := recover(); caught != nil {
			if caught == errJsHalt {
				log.Printf("lxi polling script took to long! Stopping after: %v\n", duration)
				return
			}
			panic(caught) // Something else happened, repanic!
		}
		log.Printf("lix polling script successfully: %v\n", duration)
	}()
	vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking
	watchdogCleanup := make(chan struct{})
	defer close(watchdogCleanup)
	go func() {
		select {
		case <-time.After(time.Duration(timeout) * time.Second): // Stop after timeout seconds
			vm.Interrupt <- func() {
				panic(errJsHalt)
			}
		case <-watchdogCleanup:
		}
		close(vm.Interrupt)
	}()
	return vm.Run(s)
}

いちおう動作したのですが、panicとか使っているので、LXIのパッケージのほうで対策したほうがよさそうな気がしてきました。GitHUBでforkして対応したいと思いますが、今朝は時間切れになってしまいました。

明日に続く

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。