kairo-gokko (38-1) タイムチャートを表示



タイムチャート機能を追加しました。

f:id:sonota88:20200726133546g:plain


おおざっぱなアイデアとしてはこうです。

  • 各時点での監視対象箇所の状態を記録する
  • 記録したデータを使ってチャートを描画

これだけといえばこれだけなので、そんなに難しくなさそうだと思ってはいましたが、 実際難しくなかったです。

実装の難しくなさに対して、見た目がグッとそれっぽくなりますし、もちろんタイムチャート機能自体も有用なものですから、これはお得ですね。


回路図での監視箇所の指定

監視箇所を回路図上でどう指定するか。

  • 監視したい箇所はランプを置きたい場所と被っているようなので、 ランプで兼ねられないか
  • 監視したいがランプは置きたくない、というシチュエーションはあまりなさそう
  • ランプとは別の部品を使う場合、回路図上で余計に場所を取ってしまう
    • 1つのセルに重ねて置くこともできなくはないが、ごちゃごちゃしそう

というようなことを考え、監視箇所の指定はランプで兼ねることにしました。 回路図ではランプのテキストに L:name のように書くことにします。

f:id:sonota88:20200726123749p:plain

また、名前を指定しない場合(L だけの場合)、監視対象ではないただのランプとして扱います。これまでのランプと同じ。

名前の受け渡し

回路図から読み取った名前を受け渡すために Unit::Lamp#name を追加。

状態の記録

状態を保持する ChildCircuit::StateHistory クラスを追加。 ChildCircuit#state_histories として持たせることに。

  • ランプに持たせる方式も検討したが、 状態の記録とランプは機能的に不可分ではないので、密結合を避けてひとまず別にした
  • リングバッファにしてみた
    • ただしちょっと雑
  • すべての時点の状態を持つ必要はなく、変化があったときだけ記録した方が (描画も)効率がよさそうだが、まずは簡単そうな方法で雑に作ってみた

描画

f:id:sonota88:20200726133213p:plain

見ての通りですが、各監視点のチャートを描画領域の下部に名前の昇順で描画します。

これまで文字の描画なしで済ませてきましたが、 名前を表示しないと対応が分かりにくいので、表示することに。

dxopal_sdl.rb の方はダミーのクラスとメソッドだけ用意して何もしない形にしました(面倒だったので……)。

備考

チャートの横幅を広げると(私の環境では)目に見えて処理落ちするようになります。 今回の修正では 1ピクセルごとに線を描画する作りにしており、描画回数の増加が影響しているようです。

対策した方がよいのですが、今日は疲れたのでここまで……。