タイムチャート機能を追加しました。
おおざっぱなアイデアとしてはこうです。
- 各時点での監視対象箇所の状態を記録する
- 記録したデータを使ってチャートを描画
これだけといえばこれだけなので、そんなに難しくなさそうだと思ってはいましたが、 実際難しくなかったです。
実装の難しくなさに対して、見た目がグッとそれっぽくなりますし、もちろんタイムチャート機能自体も有用なものですから、これはお得ですね。
回路図での監視箇所の指定
監視箇所を回路図上でどう指定するか。
- 監視したい箇所はランプを置きたい場所と被っているようなので、 ランプで兼ねられないか
- 監視したいがランプは置きたくない、というシチュエーションはあまりなさそう
- ランプとは別の部品を使う場合、回路図上で余計に場所を取ってしまう
- 1つのセルに重ねて置くこともできなくはないが、ごちゃごちゃしそう
というようなことを考え、監視箇所の指定はランプで兼ねることにしました。
回路図ではランプのテキストに L:name
のように書くことにします。
また、名前を指定しない場合(L
だけの場合)、監視対象ではないただのランプとして扱います。これまでのランプと同じ。
名前の受け渡し
回路図から読み取った名前を受け渡すために Unit::Lamp#name
を追加。
状態の記録
状態を保持する ChildCircuit::StateHistory
クラスを追加。
ChildCircuit#state_histories
として持たせることに。
- ランプに持たせる方式も検討したが、 状態の記録とランプは機能的に不可分ではないので、密結合を避けてひとまず別にした
- リングバッファにしてみた
- ただしちょっと雑
- すべての時点の状態を持つ必要はなく、変化があったときだけ記録した方が (描画も)効率がよさそうだが、まずは簡単そうな方法で雑に作ってみた
描画
見ての通りですが、各監視点のチャートを描画領域の下部に名前の昇順で描画します。
これまで文字の描画なしで済ませてきましたが、 名前を表示しないと対応が分かりにくいので、表示することに。
dxopal_sdl.rb
の方はダミーのクラスとメソッドだけ用意して何もしない形にしました(面倒だったので……)。
備考
チャートの横幅を広げると(私の環境では)目に見えて処理落ちするようになります。 今回の修正では 1ピクセルごとに線を描画する作りにしており、描画回数の増加が影響しているようです。
対策した方がよいのですが、今日は疲れたのでここまで……。