2022年2月1日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 現場での長い待ち時間でArt-Netのアドレスを自動設定するスクリプトを書いてみました。動作確認は自宅でないと出来ませんが、設定ファイルには適切に書き込みがされていると思います。OEMコードは聞き馴染みがないメーカーさんのを拝借してテストを進めます。
 RaspberryPiの7インチモニタと一体型ケースは良い感じです。ほとんどの操作はssh経由でパソコンから行うので、起動ログが読めて配線を守ってくれたら当面は十分です。

追記
 自宅で動作試験とバグ取り。問題なし。
 Rasbianにドライバが入っているUSB-etherを購入し、2つ目のNICを構成したらPythonの試験プログラムを作成開始です。

#[RaspberryPi]

2022年2月2日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 2つ目のNICも動作OKと思われます。
 将来的にwi-fiでも送信したいので出力側のNICをブリッジ接続にしました。ブリッジ接続とは複数のNICを束ね、内部からは1つの仮想デバイスとして扱う方法です。ハブを作る方法でもあります。
 wi-fiはhostapdでルーター化してブリッジに組み入れることができます。試験的ではありますが、ウチのwi-fiルーターの1台はこの方法を用いてRaspberryPiで作ってあります。
 Pythonのsocketの動作が実デバイスと仮想デバイスで違いがあるとは思えないけれど、最初から仮想デバイスでやっておけばいいかなと。

#[RaspberryPi]

2022年2月3日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 またしても現場にて長い待ち時間。
 DMXのパケットデータを表示するプログラムを作成中。ANSIエスケープシーケンスを用いた表です。
 試験用ではありますが、データを表示する何ががあると開発が進め易いと思われます。

#[RaspberryPi] #[Python]

2022年2月4日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ANSIエスケープシーケンスを組んでて思ったのですが、大昔のN-BASICみたいだなと。書式こそ違いますが、COLOR命令やLOCATE命令を思い出す風味です。N-BASICリアル世代。
 ANSIエスケープシーケンスはテキスト画面の制御コードを文字列としてprintします。画面の文字を消去しろとか、カーソル位置を何処にしろとか、引き続いて表示する文字列の色をどうしろとかを命令ではなくコードで渡すのです。大昔のVT100などで用いられたテキスト表示の制御方法ですが未だに使えるとは驚きてす。さすがUNIXの末裔。

#RaspberryPi
Icon of admin
 LED-BARのケースで使う受けを作っています。
 3x6の合板を2枚使い切りの切り出し。
 接着中で写真に入っていないのもありますが、切っても切っても終わらない。

20220204204537-admin.jpg

 上に乗っているようなのを12個作ります。

 一見少なく感じますが、この量で合板1枚分。
 切ってはバリ取り、切ってはバリ取りの繰り返し。
 小さい短冊でも60枚ですから、そう簡単には終わらない。
 今日はここまで。

 日中は切った貼った。
 陽が暮れたらソースコードを書き書き。
 アホですわ(笑

#ガチ工作
Icon of admin
 ANSIエスケープシーケンスを研究中ですが表示がおかしい。
 コードは間違いなくprintしているのに表示されない。いや、表示されることもある。
 さて・・・

 どうやらバッファの挙動によるものでした。
 printで表示される文字列は一度バッファに蓄積され、バッファが一杯になるか、改行コードなどを受けると表示に渡されるのだとか。

 単にprintするならその都度改行コードが発行されますのでその都度表示されるのですが、文字は表示したいけど改行したくないことがあります。

 pythonのprintですと、

 print('表示したい文字列', end='')

 とすると改行せずに表示が実行されますが、改行が発行されないとバッファが一杯になるまで何も表示されません。
 表示されたり表示されなかったりで困ったのですが、強制的に表示に送る方法がありました。

 print('表示したい文字列', end='', flush=True)

 最後に flush=True を加えるのです。
 こうすると、バッファや改行コードに関係なく、printが実行される度に表示されます。

 自由度が広がりました。

#Python

2022年2月6日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ANSIエスケープシーケンスですが、RaspberryPi上のPythonでは期待する動画が出来ないかもしれません。形にはなるのですがチラつきます。
 開発作業用と画面の試作を兼ねてDMXスロットの値を一覧表示する画面を作っています。値の表示は遅くとも0.1~0.2秒くらいで更新しなければなりませんが、前の表示が完了していないのに次の表示が実行されているような感じで、行単位での一瞬の点滅が不規則に発生します。
 細かいことはともかく、これではダメです。

 動画を表示出来るのですからテキスト画面の更新を0.1秒間隔でやるなど楽勝だろうと思っていたのですが、そもそもテキスト表示の書き換えにこんなレスポンスは不要だと作られているのかもしれません。
 基本的な動作だけに余裕を持って動いてくれないと困ります。

 RaspberryPiの作り的に、ANSIエスケープシーケンスでテキスト画面を構成するより、グラフィカルな画面に今どきの方法で表を書いた方がいいのかもしれません。

#RaspberryPi #Python

2022年2月7日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ANSIエスケープシーケンスのチラつきの原因がわかりました。
 行削除です。コードは'\033[2K'。
 上書きしないと文字が消えないので行を削除してから書いていたのですが、消すのではなく空白で上書きすることで解決しました。
 いやはや。

#RaspberryPi #Python
Icon of admin
 ANSIエスケープシーケンスは何とかモノになりました。
 画面の試作段階ですから受信データを表示することは出来ませんので、仮のnumpy.arrayを加算し続ける処理で動きを確認しています。インクリメントした値の256の剰余(割った余り)です。
 チラつくことなく求める動作をしていますし、画面処理の負荷は(topにて)7%くらい。いいんでないか?
 ちなみにpi4のCPUは4coreなので、topコマンドでの最大値は400%です。

 この後はArt-Netの受信とキー操作です。

 Art-Netはsocket通信で受信したパケット(バイナリ)を適切に変換してデータ化するだけです。通信の難しいことはライブラリがやってくれるので、たぶん、それ程難しくはないと思います。
 キー入力は最終的なコマンド実行までどう持っていくかです。様々な手順が考えられますが、どうやるのがいいかよく考えてみましょう。

#RaspberryPi #Python

2022年2月8日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
仮ですが、コマンド入力を作りました。
今回はArt-Netの受信データを表示することが目的なので、対象ユニバースを指示するだけの[ニーモニック-数値]のシンプルな物にしました。
Net,Subnet,Universeなどのニーモニックを[N][S][U]のキーで呼び出し、数値を打って[Enter]で確定です。それぞれのコマンドには設定数値の範囲がありますので、範囲外であればエラーというか「このコマンドの数値範囲はこうだよん」と表示する様にもしています。

#RaspberryPi #Python

2022年2月9日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 今週来週はコロナ騒動で現場が飛びまくり、急ぎの要件はありませんので工作を徹底的に進めます。
 客席テーブルが現場から帰ってきたので天板表面の再塗装です。
 先日も書きましたが、問題はウレタン塗料の柔らかさです。私の施工が間違っていたのかもしれませんが、ゴム脚の当たっていたところが凹んでしまったのです。硬さを増さないといけません。オービタルサンダーで前の塗装を削り落とし、FRPで使うポリウレタン樹脂を塗ります。
 一層目は表面に塗るというよりポリウレタン樹脂を木の繊維に染み込ませるイメージです。気温が低いので硬化剤を重量比1.2%(夏季の2.0倍強)加え、アセトンを重量比40%加えてシャバシャバというかサラサラにし、塗ったというより濡らした感じにしています。
 アセトンの量は変質しないギリギリかと思います。硬化しなかったら笑うしかありませんが、モノ作りの神様に見放されないことを祈りつつジックリ取り組みましょう。

#ガチ工作
Icon of admin
 socketの送受信は簡単ですが、受信は待ち受けになり、タイムアウトはあるものの、有効な受信があるまで全体の動作が一時停止になります。待ち受けをしながら他の処理を止めずに動かす方法の確立が当面の課題になります。
 ネットを探すとそれらしい方法がいくつかあります。たぶんこの中に望んでいる方法があるのだと思いますが、それがどれかをこれから検討するワケです。

#Python
Icon of admin
 客席テーブルに塗布したポリエステル樹脂は硬化していました。一安心。
 ただ、アセトンが抜けるのに時間がかかりそうです。急がず焦らず今日は手を付けず、1日なのか2日なのか、アセトンが抜けたのを確認出来てから2層目にかかりましょう。
 2層目は濃い目で肉付けをします。原液ままでは硬いのでアセトンを入れて少し柔らかくするつもりですが、塗り伸ばせる範囲で固めが望みです。熟練者なら室温で判断がつくのでしょうけど。
 3層目は顔料を入れて色付けです。
 単に1層目だからかもしれませんが、アセトンを多めに入れると硬化した表面が半艶になるようです。顔料を入れた3層目がツヤツヤ過ぎるなら、トップコートを兼ねてサラサラを塗ってみましょう。

 小学生の頃、シンナーで溶かした発砲スチロールで紙を固められないか?と実験したのを思い出しました。
 表面が固まっても中が固まらなくてガッカリした思い出ですけど、約半世紀後もやってることに大差がない。「三つ子の魂百まで」という格言がありますがその通りかもしれません。
 ひょっとすると、発砲スチロールはアセトンで溶けるので、ポリエステル樹脂を半艶にする添加剤代わりになるかもしれません。ポリエステル樹脂は不純物を入れると艶が落ちるような気がするのです。

#ガチ工作
Icon of admin
 オレメモです。

 socket受信の待ち受けで処理が一時停止するなら、threading用いた並列処理でsocket受信を実行し、メイン側へはqueueを使って通信する。
 socketから受信したデータはqueue.putでメイン側に送る。block=True,time_out=Noneとし、block要因はメイン側での取り出し作業だけなので終了を待つ。
 メイン側はqueue.getをtry:配下で実行する。block=Falseとし、queueにデータがあれば取り出し、データが無いかsocket受信側がアクセス中でデータが取り出せないと例外:Emptyになるのでtry:でスルーする。

 queueでやりとりするデータはintのNet,SubNet,Universeとレベルデータのnumpy.arrayをタプルにした物とする。タプルに入れ込んだnumpy.arrayをqueueで扱えるかは今後の実験で確認する。
 受信したArt-NetのUniverseが対象かどうかはメイン側で判別する。

 これならsocketの受信待ちで全体を止めることなく動かせる、といいな。

#Python

2022年2月10日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ポリエステル樹脂は24時間経過でいい感じに硬化していたので2層目を塗布しました。
 混合はポリエステル樹脂100g、硬化剤2g弱、アセトン10g。計量に使っている量りが1g単位なので0.1g単位のが欲しいかも。
 細いバリが固まったのを#320で軽く砥ぎ、削りカスを取り除いてコテバケで塗り込みました。
 気温が低いので硬化が遅いですが気長に待ちましょう。

 3層目を塗る前にはキッチリ砥ぎます。鏡面は目指しませんが、指で触って凹凸を感じない程度に面を出してから塗りたいですね。

#ガチ工作
Icon of admin
 2層目を塗って気が付いたのですが、バリっぽいのはコテバケから出た毛クズが固まったモノでした。
 刷毛で塗っても毛クズが出ますし、ローラーなどもってのほか。スポンジ系はアセトンで溶けそうなので使えない。
 ペーパーで簡単に落とせるのでトップコート以外ではいいのですが、肝心のトップコートは何で塗りましょう。
 ガンを使えばいいのですが、準備や片付けに手間暇がかかるし周辺への飛散も多い。量を塗るとか特別に綺麗に仕上げたいとかなら使いますが、さほど仕上げにこだわらない5尺2尺の板を1枚塗るのに使いたくはありません。
 目の細かいスコッチブライトで固まった毛クズを落としてポリッシャー磨きが王道?
 ゴムベラで塗ればいいのかな?
 スコッチブライトで削ってヒートガンやバーナーで目潰し?
 どうしよう。。。

#ガチ工作

2022年2月11日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 3層目を塗布してみました。#240で表面を均し、2層目と同じレシピに顔料を混ぜた物をコテバケで塗りつけです。
 昨日よりも気温が5度以上高いためか硬化反応が早い。24時間かからず、今日中に硬化しそうです。
 顔料を入れましたが半透明です。制限量に近い量を入れましたが、1度で完全に色が乗るモノでもないようです。
 明後日から現場使用なので作業は一旦中断です。

 ポリエステル樹脂の表面仕上げですが、ペーパーとスコッチブライトで磨いた後にアセトンを噴霧したらどうかと。深く溶かすのではなく細かい磨き目を消すだけですから、ほんのわずかに表面を溶かして均せればよい。
 ただ、アセトンに耐えられるスプレーボトルを近所で求めると高価な製品しかありません。恒久的に使うならアリですがお試しには高い。手元にラッカーシンナーやエタノールに対応したスプレーボトルが沢山あるので、アセトンに対応するかは確認出来ませんが、まずはコレでお試ししてみようかと。入れて15分くらい様子を見ればわかるっしょ。
 噴霧するのはジクロロメタンでもいいのかな?ジクロロメタンは3Dプリンタの造形品(PLAやABS)の表面を均すのに使っていますが、ポリエステル樹脂も溶かすっぽい。すぐ乾くのでアセトンより良い?

#ガチ工作

2022年2月12日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 3層目は無事硬化しました。
 コテバケは掃除機で毛クズを除去して使いましたが完全にとはいきません。なでるとバリのようなのがあって気分が悪い。
 #120-#240-#400と研ぎ進め、アセトンを噴霧しましたが、削り目を無くすことはできませんでした。
 どうしようかと考えていたところ、倉庫の隅からダブルアクションのポリッシャーを発掘。今は無いホームセンターのシールが貼ってありましたのでかなり前に買ったのでしょう。
 バフを取り付けてコンパウンドで磨いたところ解決。ペーパーは#400までしかなくコンパウンドも中目しかありませんでしたので鏡面にはなりませんが、毛クズバリを除去し削り目は十分に抑えられました。よいんでないか?
 明日から一週間ほど現場に出ますが、その後にポリエステル樹脂をもう一層塗布し、もっと目の細かいペーパーとコンパウンドを使って仕上げるつもりです。

#ガチ工作
Icon of admin
 RaspberryPiにRTC(リアル・タイム・クロックを取り付けてみました。
 RaspberryPiは無電源だと時計が動きませんので、起動すると前回終了した時刻から時計がカウントされます。
 これでは気持ちが悪いし、ファイルの更新時刻がおかしくなると開発作業ではトラブルのもとです。
 リンクの商品以外にもRTCはいろいろありますが、この製品は小型でGPIOに挿すだけで使えて何かとよいと思います。安価だし。
 設定方法はこのサイトがわかりやすいと思います。/boot/config.txtを更新した後に再起動を忘れずに。

#RaspberryPi
Icon of admin
 PythonのThreadとQueueの使い方はだいたい理解しました。
 0.005秒のsleepで動作周期を持たせたThreadで512個の整数を延々と加算してqueue.putに出力し、本処理では0.001秒のsleepで動作周期を持たせたqueue.get_nowaitで取り出しながら0.1秒毎に表示を更新しています。処理負荷が小さくメモリ使用量も安定していてスムーズです。本処理での時間軸の管理はアセンブラっぽいカウンタ処理ですが、厳密な処理周期は不要なのでsignalを使うほどでもありません。
 Threadを使うメリットは高速化だと書く人が多いですが、私にとっては、処理によって違う要求時間を仕分け出来て、ポーリングだけど割り込みっぽいことが出来ることです。画面の更新はそれほど頻繁でなくていいけど、毎秒44回更新されるDMXの信号の処理は遅れたくないのですが、シングルスレッドでこの辺りを制御するのは案外面倒なのです。
 気を付ける点はQueueのputやgetのタイミングです。Queueは変数ではなくFIFO特性のスタックなことが肝ですが、C言語のスタックやポインタにセマフォが混ざった構成なので、C言語のこのあたりを知ってないと理解しにくいかも。PythonにC言語っぽい作法が残っているのが不思議ですが・・・
 ThreadとQueueを使ってキーボードの入力も作り直します。

#RaspberryPi #Python

2022年2月13日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ありがちな1液式の塗料は1週間以上放置しないと現場で使えませんが、ポリエステル樹脂は2日もあれば完全硬化して使えます。扱いが面倒なところや少なくない制限もありますが、現場投入までの工程としてはむしろ使いやすいかもしれません。
 そんなポリエステル樹脂を塗布した客席テーブルは今日から現場に出向です。自分は行きませんが、在籍園児が数百人いる幼稚園のお遊戯会で部下が一週間ほど使います。客席に卓を仮設するので客席テーブルの本業であります。使い勝手の確認はもとより、荷重をかけ続ける状況なのでロードテストにはうってつけです。
 この幼稚園は若園長が好き者で、スモーク炊いてムービング使って有名アイドルのアリーナコンサートよろしくゴリゴリにしたいとか。過去映像を見ましたが、明かりは頑張ってイイ感じに作ってますが、園児たちが自由過ぎてアンバランスなのか面白いのかよーわからん。お遊戯会でここまでしてどうする!?ってのが本音ですが、園児たちの思い出になって親御さんが楽しんでくれるなら仕事としては成立。
 ということで、ダメなところと傷みやすいところがもっともっと見えてくるといいかな。

#ガチ工作
Icon of admin
 Art-Netのアプリは画面表示とキー操作まで一応の完成をみました。
 キー操作はレスポンスに少しムラがあるので改善したい点です。使えるレベルなので今のところは将来課題としておきますが、ユーザーがご機嫌をうかがいながら使うユーザーインターフェースは大嫌いなのでとても重要です。

 余談ですが、売れている卓とそうでもない卓の違いにはこういった点の僅かなストレスの差もあります。卓は手段としての道具ですが、国内メーカーはカタログスペックばかり求めて手に馴染む道具を作ろうとしない。買うのは使う人ではありませんから仕方ないことでもありますが、国産のホール卓がダメな点です。国産で唯一、松村さんの卓にはこういったストレスが少ないのですが・・・。

 とまぁ愚痴はおいといて、これで本丸であるArt-Netの受信に取り掛かれます。
 単純な受信は別回しするThread内のsocketで受けるだけなので難しくないと思うのですが、パケットのデコードが少し面倒かもしれません。Art-Netのパケットはバイト列ですが、これらをPythonで扱いやすい様に分解して変換しなければなりません。Pythonはバイト型の扱いが少し苦手ですし、パケットにはアスキーテキスト、LSBの2バイト数、MSBの2バイト数、バイト型が混在しているので、よく考えて作らないといけません。実行回数が多い処理なだけに軽さも重要です。

#[Art-Net] #Python
Icon of admin
 Art-Netの受信データをデコードする処理を書いてみました。
 製作環境はRspberryPi4、Rasbian_buster、Python 3.7.3です。
------

import numpy as np

class coding:
 def decode(self, artnet_packet):
  """ Art-Netのbyte列を要素に分解する """
  id = artnet_packet[0:8]
  opcode = int.from_bytes(artnet_packet[8:10], 'little')
  prover = int.from_bytes(artnet_packet[10:12], 'big')
  sequence = int.from_bytes(artnet_packet[12:13], 'little')
  physical = int.from_bytes(artnet_packet[13:14], 'little')
  subuni = int.from_bytes(artnet_packet[14:15], 'little')
  sub = subuni // 16
  uni = subuni % 16
  net = int.from_bytes(artnet_packet[15:16], 'little')
  length = int.from_bytes(artnet_packet[16:18], 'big')
  data = np.frombuffer(artnet_packet, dtype=np.uint8, count=length, offset=18)
  return (id, opcode, prover, sequence, physical, net, sub, uni, length, data)

if __name__ == '__main__':
 an = coding()
 id, opcode, prover, sequence, physical, net, sub, uni, length, data_uint8 = an.decode(test_artnet_packet)

※ 行頭の空白には全角を使っています。
------
 test_artnet_packetに受信データを入れ、codingのインスタンスanでdecodeを呼び出します。
 書いてみたら案外スッキリした物になったので記念に掲載しました。

 socketで受信するのはバイナリデータ(Pythonで言うところのバイト列)ですが、これを一発でnumpy.arrayに変換してくれるnumpy.frombufferは便利です。
 int.from_bytesもバイト列をエンディアン指定でint数に一発変換してくれて便利です。
 私はPICマイコンと協調させて使うことが多いので、こういった機能があると助かります。

 上記ですとdataの戻り値がnumpy.uint8ですが、計算するためにはnumpy.uint16の方が良いと思います。
 data_uint16 = data.astype(np.uint16)
 とかで型変換するといいかもしれません。

#Python #[Art-Net]

2022年2月14日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 RaspberryPiを触っていて思うのですが、普通のPCにもRaspberryPi並みのGPIOがあればいいなと。
 RaspberryPi仕様のGPIOがベストって意味ではありませんが、PCにもローレベルのインターフェースがあったら制御で便利に使えるのになと。
 もちろん存在していますが、あまりにニッチ過ぎて情報が少ないために敷居が高いのです。
 主にUSB接続ですが、PCI-eボード1枚にI2C、SPI、USART、GPIOが「これでもか!」ってくらい載ってるのがあったら欲しいかも。

#妄想
Icon of admin
 雪に隠れていた縁石に自家用車のタイヤをやられました。
 鋭利に割れていたのでサイドウォールがパックリ。雪は滑るだけが危険要素ぢゃないようです。
 サイドウォールは修理が出来ないので交換ですが、冬タイヤはトップシーズンのために割高な物しか手に入らず懐も寒くなりました。
 運が悪かったと思うしかありませんが、テンション下がるわー。
 開発が順調でテンションが上がっているので丁度いいのかもしれませんけど。

#日常
Icon of admin
 Art-Netの受信に成功しました。
 先達のサンプルコードをコピペしてPort番号を書き換えただけで一発OK。積年の成果が出て良かったのですが、あまりにも簡単だったので肩透かし。
 複数のNICを使い分けるsocketの設定は先達情報に何パターンかありますが、Rasbian上のPythonに合うパターンを見つけるのに少し時間がかかったかもしれません。
 今は卓のエフェクトエンジンで出力したデータが画面に流れております。4096chのディマーを256bpmの正弦波で動かしています。アホか。

 テストデータはMAdot2からですが、SequenceとPhysicalにデータが出ていました。
 Sequenceは単純なインクリメント情報、Physicalは卓内のUnivres番号です。
 送信を作るときにはこの流儀を真似しましょう。

 ただ、MAdot2はOpCode<0x5000>以外のArt-Netパケットも出しており、socketで受信したバイナリが19バイト以上で頭12バイトがb'Art-Net\x00\x00\x50\x00\x0E'であることを最初にチェックしないといけません。当初はバイト長も見ずにb'Art-Net\x00'だけでチェックしていたのでデコード処理でエラーが頻発でした。OpCodeによってデータ長も内容も違うので当然の結果ですが、マルチキャストなら<0x5000>以外のOpCodeは出さないと先入観で思ってしまったようです。よくないですね。

 8ユニバースを受信させています。すべてのユニバースをデコード処理までしていますが、思った以上に軽々動いています。
 Sequenceをキーに連続性をチェックしましたが読み飛ばしもしていないようです。

 今のところは先日作った画面ではなくすべてのパラメータを表示するチェック用の画面に表示していますが、先日作った画面を同時に動かしてもCPU負荷は45%程度です。最大値は400%(100%×4コア)なのでまだ余裕があります。

#Python #[Art-Net]
Icon of admin
 Art-Netの受信に成功して処理負荷に余裕もあるとなれば落としどころをどうするか!?って話にもなるワケです。最大の望みはディレイ機能とカーブプロファイル機能を持ったパッチマシンですが、欲を出し過ぎたら頓挫します。
 さてさて、どこまで行けるのでしょう。

 お試しに次ぐお試しでとっ散らかったソースコードを整理整頓し、受信モニタとしてまとめ上げてからの話ですが、受信したArt-Netを送信する試験をしましょう。
 ただし、単にリレーするだけでは面白くないし処理負荷の確認にもなりません。受信をデコードし、1対1のパッチ処理をし、エンコードして送信することにします。1対1とはいえマッピングデータ用いた入れ替えをすれば最終形の負荷に近くなると思います。ここまでやれば天井が見えてくるでしょう。
 もしRaspberryPiには荷が重いならPCで動かせばいいって話もあります。今のところRaspberryPiというよりDebian上のPython3.7で動く様に作っていますのでPCでも動くと思います。レガシーDMXを搭載せずにいる理由の一つでもあります。

 今どきのムービング卓はArt-Netを出しますし、Art-Netのデコーダーは既製品が沢山ありますので、レガシーDMXまで作らなくてもいいかなぁ~なんて思ってます。専用基板を作る初期投資がキツイってのが一番大きいですが・・・

#Python #[Art-Net]
Icon of admin
 オレメモです。

 パッチマップ(出力側ベース)
 ・フリーフェーダースロット
 ・ディレイ:<0>ならスルー、<1-255>ならディレイ
 ・ユニバース(入力参照)
 ・スロット(入力参照)
 ・カーブプロファイル:<0>ならスルー、<1-511>なら以下とする
   >カーブプロファイル<1-255>はノンディマーとしてしきい値とする
   >カーブプロファイル<256-511>はカーププロファイルマップを参照する

#[Art-Net]

2022年2月15日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 本業もボチボチ忙しくなってガラクタ週間も終わりを迎えようとしています。

 現場と打ち合わせの合間にArt-Netです。
 受信したバイナリをそのままの送信出来ないようでは先には進めませんが送信できない問題。
 解決はしましたが、正規マニュアルや先達の書き込みに「これはちがう」とある設定で動いてしまいました。

 基本環境:RaspberryPi4 Rasbian_buster Python3.7.3
 ネットワークインターフェース:内臓LANポート(eth0)、USB-LANアダプタ(eth1)
 IPアドレス:eth0もeth1もArt-Net用に設定済み。
 試験環境:MAdot2でArt-Netを送出、RaspberryPiを経由、中華電機のArt-Netデコーダで受信、レガシーDMXをDoctorMXでモニタ。
 処理内容:eth0で受信したArt-Netのバイナリをeth1で送信するだけ(これが出来なきゃ始まらない)。

-----

import socket

def artnet_rx_tx():
 """ 基本パラメータセット """
 RECV_HOST_NAME = ''
 SENDTO_HOST_NAME = '255.255.255.255'
 PORT = 6454
 """ socket受信の設定 """
 artnet_rx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  #UDPによるソケットを宣言(受信で使う)
 artnet_rx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth0" + '\0').encode('utf-8'))  #ソケットとNICを関連付け
 artnet_rx_sock.bind((RECV_HOST_NAME, PORT))  #送信元とポートをソケットに関連付け この場合はどこからの送信でも受けるって意味になる
 """ socket送信の設定 """
 artnet_tx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  #UDPによるソケットを宣言(送信で使う)
 artnet_tx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8'))  #ソケットとNICを関連付け
 artnet_tx_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)  #ソケットをブロードキャストとして使う宣言
 """ 中継 """
 for i in range(800):  #繰り返し
  artnet_rx_bytes, addr = artnet_rx_sock.recvfrom(1024)  #受信処理
  if len(artnet_rx_bytes) > 18:  #受信データ長が最低長以上かを確認 下行とandで一文にしても意味は同じですがヘッダー長を下回った時にエラーになる
   if artnet_rx_bytes[0:12] == b'Art-Net\x00\x00\x50\x00\x0e': #DMXの値データだけを選別 ヘッダーチェック
    artnet_tx_sock.sendto(artnet_rx_bytes, (SENDTO_HOST_NAME, PORT)) #送信処理 ここがわからんで時間を喰う
 """ 終了操作 """
 artnet_rx_sock.close()  #ソケットの仕舞い
 artnet_tx_sock.close()  #ソケットの仕舞い

※ 行頭の空白と#は全角で書いていますので、このままコピペするとエラーになります。
-----

 for文による繰り返しで800回中継を行うテストソースです。

 ポイントはBroadcastの送信先を指示する「SENDTO_HOST_NAME」です。socket.sendtoのパラメータです。「RECV_HOST_NAME」と同様に空白データを割り付けるベシとされるのが一般的ですが動きません。Broadcastアドレスを示す古い方法の'255.255.255.255'にしたところ稼働したという話です。
 '2.255.255.255'や'10.255.255.255'でも稼働しましたが、'255.255.255.255'はゾーンの末尾アドレスを示すマジックナンバーらしく汎用性が高いと思われます。

 動けばいいのですが、かなりの時間を喰ってしまい課題の残りが明日以降になりました。

 ここまで出来ればパッチマップによる入れ替え処理を作ります。
 壮大な繰り返し処理となりますので、どれだけ簡素に出来るかがカギになります。

#Python #[Art-Net]

2022年2月16日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 空き時間が少なかったのですが、Art-Netのエンコードを試してみました。
 受信したバイナリをデコードし、パラメータをそのままにエンコードして送信です。単純な動作ですが、これが出来なきゃパッチマシンなど絶対無理というテストです。
 卓からの8ユニバースをすべて処理したのですが、負荷の増加は2.5%くらいでした。十分に許容範囲で収まったのは良いことです。
 パッチマシンは8in8outくらいを想定していますが、16in16outも可能だったりして。16ユニバース出る卓が無いので試せないし作ってもオーバースペックなので私は不要かな。機能全体を組み込んでから悩むことですが・・・。

 今のところ1日1課題。
 あとどれくらいの課題があるのかわかりませんが、納期はありませんのでノンビリいきましょう。ここまで出来れば、丁寧にclassライブラリにまとめ上げ、コメントに使い方を明記して後々も使える様にしておきましょう。
 そういう意味ではキー操作やモニタ表示もclassライブラリにして汎用性を高めるのがいいですね。

 と言いますか、このまま書き増しを続けるとソースコードがグチャグチャになって後で後悔しそうです。
 私のメインはPICのアセンブラなのでANSI-Cの関数タイプっぽい書き方をしがちですが、Pythonならオブジェクト指向な書き方をしたいものです。最近、クラス、インスタンス、継承を使う意味と感覚がわかってきましたので、出来るだけそういった書き方をしていこうと思います。
 以前は「継承」ってのが感覚的にわからんかったのですが、関数を束ねて新しい関数を作るだけだと簡単に考えればいいみたいです。ただ、関数は実体なのであっちこっちの関数から同じ関数を同時に呼ぶと衝突が起こります。解決には親関数の中で使う関数を親関数にとって専用にすればいいのですが、同じ様な関数を使うだけ書くのは面倒だしやらたとソースが大きくなるので、ひな形であるクラスから実体のインスタンスを作るという発想になったのだと最近ようやく「感覚的に」理解出来ました。
 その筋の解説書を読むと「継承はオブジェクト指向という高貴な峰の頂」みたいな奇妙に美化した記述が多いのですが、その実態は「楽して俺様関数書きてぇ〜」って俗っぽい発想でした。美化した手段を書くだけで目的を書かない解説書が多いので感覚的にわからんかったのです。

#Python #[Art-Net]

2022年2月17日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ガラクタ週間が終わり、終日本業のデスクワークでした。
 会場図面書いて、照明プランの概要まとめ、見積りというデスクワークの王道メニューです。
 嫌いじゃないのですが、ガラクタネタが中途なのでソワソワします。
 今やっているArt-Netは卓とデコーダが必要な作業なので、荷物も多いし広いスペースも必要です。しばらくはお休みかな。
 明日から現場が続きますが、RaspberryPiだけ持って行って現在のソースをオブジェクト指向っぽく書く練習をしようかなぁ。

 そうそう、製作というレベルではありませんが、ピンスポット用の照準器を増産しました。その実態は小型カメラ用の自在雲台を介して短いピカティニーレールをピンに取り付けるクランプです。
 細かい部品を買い増しして組み立てるだけなので15分くらいの作業でしたが、なぜ思い立って作ったかと言えば数日後の現場で数年ぶりにピンを振ることになったからです。
 鈍った腕でも対応出来そうな演目ですが、お年頃からくる目のコンディションでバインド照準器が使えませんので、ダットサイトなどの目印が遠くに見える照準器に頼らないとダメだと思われます。
 このクランプは5-6年前に作った代物です。以前作った物は部下にあげてしまったので、余っていた部品で改めて自分用をこさえたワケです。

#RaspberryPi #Python
Icon of admin
 昨晩、思い立って調べてみたのですが、Pythonで並列処理をする方法には大きく分けて2つあると理解する。ThreadingとMultiprocessingです。

 今までに何度も読んでいたサイトばかりですが、何故だか内容が突然理解できるようになりました。たぶん今まではPythonをスクリプト言語だと思っていたからでしょう。Pythonという皮の裏にC言語がある思えばスムーズに理解が進みました。

 似たような別ライブラリもありますが、意味合いとしてはこの二つに集約されていると思っていいでしょう。
 大雑把に言うなら、Threadingは比較的楽に使えるがCPUスレッドは1つしか使えない。Multiprocessingは複数のCPUスレッドを使えるがプロセスが起動するのに時間がかかり記述も少し難しい。
 難しいといっても、プロセス間通信の制約とタイミングくらいなもので、関数自体はThreadingとMultiprocessingはとても似ているので片方を覚えればどちらも使えそう。関数間で通信するQueueは使うライブラリが違うので注意ですが、これも関数が酷似しているのでストレス少ないかも。
 Python3.8からは共有メモリというC言語のポインタに近いことが可能になっているので、RaspberryPiのPythonも3.8になることを心待ちにしております。変数の型やデータ長を厳密に管理しなければなりませんが、それさえやっておけばいいので問題無し。デバイスとやり取りする処理では普通にやっていることだし。

#Python

2022年2月19日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 今週末は小屋付きの増員ですが、毎度のことながらそれほどやることはありません。
 居眠りも出来ないので、パソコンに向かって仕事をしている風味でArt-Netのソースコードの見直しです。勢いで書いた関数型のC言語っぽいコードをPythonらしい書き方に直しつつ、贅肉を削っております。

 Pythonには群のデータを扱う方法がいくつかあります。Art-NetというかDMX512のパッチマシンを作るにはこられを巧く使うことが大事です。
 これらには大きく分けて3つあります。list型、taple型、dictionary型です。これらは似ていますが出来ることが違います。また、どれを使っても出来ることでも内容によって処理速度が違ったりします。特徴をよく理解して使わないと損です。

 list型は群に対しても個に対しても計算が出来ます。文字列に対する加工も含まれますが、他の型ではそれが出来ません。
 taple型は様々な型のデータを一つに束ねて扱えます。関数の戻り値は基本的にこれだと思っていいでしょう。taple型の使い方がわかるとPythonの便利さが実感出来てコーディングの幅も広がるような気がします。
 dictionary型はデータ参照用と言ったらいいでしょうか。キーワードに対して様々な型のデータを関連付けられ、なんといっても抽出が速い。キーワードが規則性のある数値の場合は他の2つもあまり変わらないかもしれませんが、キーワードが規則性を持たない場合はdictionary型が圧倒的に速く便利だと思います。
 具体的な違いや用法はその筋の教科書や先達の書き込みに任せますが、PythonがPythonであるところはここなのかもしれません。

 RaspberryPiが見た目以上に優秀なハードウェアなのもありますが、Pythonで制御系を書いても遅いとは感じません。
 もちろん、C言語とかで書いてコンパイルした方が速いのは間違いありませんが、書いてすぐに実行できるPythonは生産性が高いと思います。
 少し遠回りかもしれませんが、C++に書き直すことを前提にPythonで書き、動いたらC++に移植するってのが制御系を作るのにいいかもしれないなぁ~なんて思ったりしてます。コーディングの規則が違うだけで書く内容は凄く似てますので、PythonでスケッチしてC++で清書するのです。勢いで書いたPythonをPythonらしく書き直すなら同じことかなと。

#Python

2022年2月20日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 今日も大半が待機時間な小屋付き増員です。

 Art-Netを送信する物が無いので画面とキー操作の作り込みをしました。
 簡単なようで難しいのがキー入力です。
 どんな文字でも受け付けるinput()などの文字列入力コマンドを使えば入力自体は簡単ですが、カーソルキーなどを即応させたいし、ホットキーでコマンドを入力したいし、入力の際にエラーにならない様にフィルタをかけたい。
 面倒だったのは数値の入力。用いられる数値には範囲がありますから、範囲外の入力がされたならその時点でアラートを出したい。
 例えば、数値範囲が0-127だとして、128や1000などの範囲外の数値が入力されたならその時点でアラートを出す。求める数値が整数なら小数点以下の入力は阻止する。数値を得たいのだから数字キー以外の入力は受け付けない。など。
 求める操作のリズム感によりますが、数値範囲や小数点の条件などでフィルタする関数を作っておいても無駄にはならないでしょう。
 当面の目標であるArt-Netのモニタは整数だけを受け付ければいいのですが、極端な話「.」ピリオドを受け付けなければこれは簡単。小数点以下1桁の範囲指定が一番面倒でした。

 これらの処理には「正規表現」と呼ばれる奇怪な文字列を使わなければなりません。「3桁以下の整数文字列='^[1-9][0-9]{,2}$'」とか「小数点以下1桁の2桁以下の実数文字列='^[0-9]{,2}\.{,1}[0-9]{,1}$'」といった書き方をします。なんですかねコレ。
 慣れてしまえば、まぁ、ありかなと。ANSIエスケープシーケンス並みに古いVT100時代からの名残りです。

#Python

2022年2月21日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 画面とArt-Netの送受信を結合させられる段階になりました。Art-Netをスルー出力し特定のユニバースをモニタします。
 簡易ながら実験段階で出来ていることですから、画面を整えたからってなんだよって構成ですが、パッチマシンの一部を先行して作っているので重要な過程です。表示することが目的ではなく、最低限持たなければならない機能を出来るだけ見やすく使いやすく軽く、そして今後の伸びしろを持たせた構成でまとめ上げることが目的です。

#[Art-Net]
Icon of admin
 開発作業用のノートパソコンはWindows11ですが、慣れると使いやすいですね。
 そう思う操作感の大半がMacOSやLinux系のパクリに見えますが、古いアプリも設定さえすれば安定して動くので便利に使えてます。
 誰かが作ったコンテンツやサービスを消費するだけならiOSやAndroidが良いと思いますし、日常使いの文具としてやネット上のシステムを踏み台に発信するならMacOSが便利だと思いますが、舞台照明系のシステム構築やガチなモノづくりをするならWindowsの方が環境を整えやすいと思われます。使いたいのはOSではなくアプリやネット上のサービスですから、趣向や目的に合わせて選べばいいのです。
 数十年前にMP-80というワンボードマイコンにハンドアセンブルを16進数で打ち込むことから始まった私にとってはどれも便利過ぎるのでどれでもいいのですけど。

#日常
Icon of admin
 このところ何回か出ている「VT-100」について少し解説。
 私も使ったことはありませんが、今のパソコンやスマホに至る画期的な発明だと思います。

 まだパソコンという言葉すらなかった時代、コンピュータという言葉だけでそれらが総称されていた時代、大型汎用機(メインフレーム)をより使いやすくするための端末として開発された物です。
 見た目にはMS-DOS隆盛時代のパソコンみたいな姿をしていますが、大雑把に言うなら「リモコン」です。単体ではキー入力を画面に表示するくらいしか出来ません。処理を行うメインフレームに指示を送り、その戻りを表示するだけです。今どきの感覚のOSも搭載されておらず、データを保存する機能もありません。

 ですが、このVT-100を発端にパソコンやインターネットが生まれたと言っても過言ではないのです。
 たぶんですが、VT-100だけで完結させて何か出来たら面白くね?と思った人がいて、本当にそうしてしまったのがパソコンの実質的な発祥ではないかと。インターネットも、離れたメインフレームを繋げたアーパネットが発祥と言われていますが、実際には遠くに置いたVT-100をもっと簡単にメインフレームに繋げたいというニーズに対し「楽するために努力した結果」なのではないかと。
 これらは私の勝手な想像でありますが、VT-100が無かったら今が少し違っていたのは間違いないと思います。

 ANSIエスケープシーケンスや正規表現などのエスケープコードと呼ばれる制御体系はメインフレームやVT-100で用いられていたもので、その名残が未だに使われているのです。
 知らなくてもプログラムは書けますが、知っていた方が便利なことも少なくありません。

#妄想

2022年2月22日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 ぼちぼち本業が復活しつつある今日この頃。
 ガラクタイジリばかり続けていても実入りはありませんのでありがたいことです。

 ガラクタイジリは本業の合間に続けていきますが、時間が少ないので課題を整理してとりかからないといけません。
 当面の課題はArt-Netパッチマシンと客席テーブルです。
 Art-Netパッチマシンは受信モニタを仕上げ、パッチ機能をハメ込める作りにしていきます。
 客席テーブルは、昨週の現場で部下が使ったのでその感想を聞き、ポリエステル樹脂を塗布した天板の具合いを見て方針を決めます。ポリエステル樹脂でもダメなら天板をどうするか更に考えないといけません。あとは軽量化です。現時点でも実用レベルの重さですが、あと5kgのダイエットを目指します。

#ガチ工作
Icon of admin
 RaspberryPiが手に入らない。手に入ってもボリボリ価格。
 世界的な半導体不足を実感した瞬間でした。

 3月下旬には入荷するそうです。

#RaspberryPi
Icon of admin
 客席テーブルに塗布したポリエステル樹脂はOKです。ゴム脚の痕は全くありません。キズはありましたが凹みにはならす。

#ガチ工作
Icon of admin
 Art-Netの受信モニタはイメージ通りに動きました。選択したユニバースをキレイに表示しています。
 当面の習作課題はクリアしましたが、喜ぶというより目の前に新たな壁が見えてきました。

 この後はartnet-coreと名付けている受信と加工を司るサーバー的な部分を作ります。
 ここまでの経験をもとに全体の構造をよく考えてから作る必要があります。

#Python #[Art-Net]

2022年2月23日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 1ファイルでPythonを書いているとソースが上下にあっちこっちして解りにくくなります。
 以前は面倒な気すらしていましたが、関数をクラスライブラリにして別ファイルにする意味がようやく実感出来ました。
 クラスライブラリにするってことは汎用化でもありますが、汎用化が目的ではなく、ダラダラ専用処理を書かないための制約と思えばいいでしょう。
 今後の拡張の為にも、ここまで書いてきたソースをゼロから書き直してみます。

#Python

2022年2月24日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 客席テーブルにポリエステル樹脂を上塗りをしたのですが、顔料を入れて過ぎたためか硬化不良になってしまいました。要は固まらない。
 完全に硬化反応したポリエステル樹脂はアセトンでほぼ溶けないようです。硬化が怪しい時はアセトンで拭いてみるとわかるのかもしれません。
 このままでは使えないのでアセトンで拭き取ってやり直しです。

#ガチ工作
Icon of admin
 ネットを何気に見ていてPythonの「継承」が具体的にわかってきました。
 「継承」はclassを使って新たなclassを作る方法です。classの中で別なclassからオブジェクトを作って使っても同様の結果を出せますが、「継承」は別なclassのインスタンスをインスタンスのまま呼んで使います。C言語をご存じの方なら、classの中で別なclassのインスタンスをincludeするイメージでよいと思います。ちょっと説明が難しいところですね。
 Pythonといいますか、オブジェクト指向言語独特の考え方のようです。実体であるオブジェクト、オブジェクトを作るレシピのインスタンス、インスタンスを呼び出せるようにまとめたクラスとなるようです。俺様関数を楽に作る方法ですから、これなら一度書いたことを多目的に利用できますで、同じことを何度も書かずに済ますことが出来ます。

 ここで重要になるのがsuper()です。ただ、これがあって初めて継承が可能になるのに、これについての説明が書籍でもネットでも弱い気がします。
 また、最もシンプルな基礎用法を題材に説明するのではなく、最もシンプルな応用例を題材に説明する文書が多いので、機能の核心を理解するのを遠ざけている傾向を感じます。

#Python
Icon of admin
 ポリエステル樹脂が硬化しなかった原因は予想の通り添加した顔料の量でした。
 顔料は色によって許容添加量が違うらしく、最初に試した青は最大8%ですが、黒は最大4%です。お察しの通り、黒を青の量でやってしまったのです。
 今回は黒の顔料を2%、アセトンを15%添加したのですが、5時間経過でベタ付きが無くなっています。アセトンが揮発して完全に硬化するには丸一日かかりそうですが、解決が見えたので一安心です。
 黒の顔料は2%でも完全な真っ黒になったので、今後は1%くらいでも良さそうです。添加物は少ないに越したことはありませんからね。他に比べ価格の割りに量が少ないのですが、少ない量で効果が出るなら安いと言えます。

 塗布方法ですが、FRP用のローラーを使って解決。このローラーは一晩アセトンに付け込んでも劣化する様子はありません。専用品ですから当たり前?
 ブラシが硬いためかペーパーで下地を均しても表面の仕上がりが僅かに波打つので避けていたのですが、書き物をする面ではありませんし、少し凹凸があるとゴム脚が滑りにくく貼り付きません。エアガンは平らに仕上がりますが、周囲への被害を考えると避けたい選択肢です。FRP用ローラーが妥協線かなと。

 客席テーブルver4.5はトップコートとして顔料無添加のポリエステル樹脂を塗布して完成にしたいと思います。艶消し剤を添加しなくても半艶に仕上がるので機械強度を第一にします。

#ガチ工作
Icon of admin
 出来るだけclass記述を用いてPythonを書いていますが、慣れるといいですね、コレ。
 そういうモノなので当たり前ですが、自分で書いたライブラリが通常のライブラリと同じ様に使えます。通常関数か、スレッドか、プロセスか、その辺りの書き分けもclass側に持たせること出来るのでメインソースがかなりシンプルになります。
 ただ、後で迷わないようにするために、ソースコード内のコメントに使い方を記述するなど、運用のコツを掴まないといけません。
 書いた本人が後日も使えるようにしておくのが一番難しかったりして・・・

#Python
Icon of admin
 オレメモ

 Pythonで文字列からANSIエスケープシーケンスを取り除く方法

 ソース
 import re
 text_ansi = '\033[2KTest\033[2;3HText'
 pattern = re.compile( r'\\033\[[0-9;]{1,}[a-zA-Z]{1}' )
 text_noansi = pattern.sub( '', text_ansi )
 print( text_noansi )

 実行結果
 TestText

 参考にしていた書き込みが間違っていました。
 制御文字(\や[)に対するエスケープ[\]がありませんでした。
 解決に時間がかかったのは自分の無知が故です。up主に文句を言ったらいけません。
 文字数を{}で指定しなくてもいいのですが、自分としてはこの方がメンテナンス性がいいかなと。

 あ、ここに書く時もそうなのですが、[\]を表示させるには注意があります。
 [\]を表示させるには[\\]としないといけない場合があります。
 「\\033」や「\[」と表示するには「\\\033」や「\\[」と打たねばならん事があるということです。システムによって若干違うようですが。
 これが原因でup主の書き込みがおかしくなっていたのかな?

 それにしても奇妙な字面です・・・

#Python
Icon of admin
 Pythonはオブジェクト指向な書き方が出来ると驚くほど書きやすいですね。人気No.1言語なのが納得です。
 継承におけるsuper()の使い方が感覚に入ってきていませんが、今日書いたテキスト画面の基本制御classを継承して定型画面を表示するclassを書いて習得しましょう。

 出来るだけ細かくclassで書いておけばC++への移植で都合が良いかもしれません。C++はゴリゴリのオブジェクト指向言語ですから、方言的な違いをclass単位でホローすれば全体の構造はそのまま行けるだろうという皮算用です。もしくは、全部をC++化しなくても、重い処理や繰り返しが多い処理だけPythonにimport出来るクラス・ライブラリとしてC++で書き直せば良いかもしれません。

#Python

2022年2月25日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 super()の使い方がピンと来なかったのは、Python2とPython3で記述の仕方が少し違った為でした。ネットにはこの辺りが区別されてない情報が多いようです。
 super()は継承で呼び出すclass(親class)の初期化を実行するものです。親classに def __init__(self): があれば必須です。無ければ不要?。渡す引数があればsuper().__init__(引数)とします。引数の考え方書き方は普通にインスタンスを作る場合と同じです。ここにselfは不要ってこと。
 継承の考え方はC言語のincludeと似たようなものです。別classであってもここに書いてあるのと同じ扱いが出来ます。違いは、変数や関数に同じ名称がある場合にエラーにならず、親classを呼び出している子classの記述が優先されます。

 ということらしい。
 結局は「同じ様なこと何度も書きたかねー」「ここをちょっと変更して使えたらなー」に応えた手段らしい。
 すっごい崇高な指向ではなく、ベッタベタに楽したい指向だわな。
 Pythonをデザインした人は「楽するために努力するタイプ」らしい。親近感がわきます。

#Python
Icon of admin
 本業の合間にPython書き書き。
 すでに動作確認は出来ていますから書式を変える作業。
 オブジェクト指向で書くと処理が部品化されるので見通しが良くて間違いが少ないかも。
 明日明後日は本業の現場なので工作はお休みです。

#Python

2022年2月26日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 オレメモ

np.abs( np_array_dt - ( datetime.datetime.now() - datetime.timedelta(seconds=0.1) ) ).argmin()

#Python

2022年2月27日 この範囲を新しい順で読む この範囲をファイルに出力する

Icon of admin
 キーボード、モニタ、ネットワークなど、ハードウェアとのやり取りを先に進めていますが、ボチボチ本丸であるパッチ機能の具体的な作りもまとめ始めています。
 パッチ機能はマッピングファイルに従って入力を出力に置き換える作業なのでアルゴリズムに難しいことはありませんが、十分な速度を得られるかが難しい課題です。
 DMX512は1スロットあたり44usecです。100万分の44秒ってことですが、8ユニバース扱うなら100万分の5.5秒以内に1スロットを確実に処理しなければなりません。RaspberryPi4BのCPUクロックは1GHz以上であり、それが4スレッドありますから間に合うような気もするのですが、確認しながら工夫していく必要があると思われます。
 なんの工夫もなくPythonを動かすとCPUは1スレッドしか使われません。RaspberryPiでは能力の1/4しか使えないってことです。CPUの能力を最大限使おうとするなら、実行ファイルを複数に分けてOSレベルでプロセスを分けるか、Python内でmultiprocessingを定義して複数のCPUスレッドがPythonの処理を請け負うように仕向けないといけません。
 multiprocessingの使い方はThreadingと似ているので難しいことは無さそうですが、こういったちょっと深いところをちゃんと書かないとRaspberryPiでパッチマシンは厳しい感じです。

#Python #[Art-Net]
Icon of admin
 先日書いた謎のオレメモ

 np.abs( np_array_dt - ( datetime.datetime.now() - datetime.timedelta(seconds=0.1) ) ).argmin()

 これはDelay機能で重要な処理です。
 日時の配列(np_array_dt)の中から、現在日時から一定の時間を差し引いた日時に最も近い日時を項に持つIndexを得ます。

 Delayを構成するにあたり、受信値に日時を付けて数世代のデータを保存し、少し前の入力値を使います。出力を遅らすのではなく入力を遅らすのです。
 パッチはパッチマップに従って入力スロットの値を出力スロットにコピーしますが、コピー元の入力スロットを探すアドレスに受信世代のインデックスも持たせれば1フェーズでパッチとDelayの処理が完了します。コピー元のアドレスの表現を「何秒前の何番LINEの何番スロット」とするワケです。Titan系からのパクリですが、LINEとはDMXの内部系統のことです。8ユニバースを扱う構想ですから8LINEあります。内部系統に入出力先をパッチするのは言うまでもありません。
 意味合いとして正しいのはパッチが済んだデータの出力を指定時間遅らすことだと思いますが、入力を遅らせてもその様に振る舞うならいいかなと。

 そもそも反応が鈍い劇場の調光装置と反応が鋭い機器をワンボードで操作しても明かりの変化を一斉にさせたいという要望からのDelayです。カットインをカットインにしたいだけで、照明効果を作るエフェクトではありません。
 ですから、厳密に設定時間分遅らせることが目的ではなく、全体が同じタイミングで動いているように「見えれば」いいので、入力の世代を管理する方法で十分だと思うのです。

 「少し前の日時のインデックス」を見つけるのが謎式の正体です。

 ちなみに、時刻を使わず日時を使う理由は、深夜24時、日付が変わる瞬間に必ずエラーが起こるからです。0時0分0秒付近でほんの一瞬ですが、設定可能な最大Delay時間前のデータが出ます。Delay最大値が1秒なら1秒前のデータが出てしまうのです。一瞬のこととはいえ、こんな潜在エラーがあったらカウントダウンの現場では使えません。

#Python #[Art-Net]