<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ 全年3月5日の投稿［5件］ - 電装工芸日記 - 舞台照明機器の製作とか - ]]></title>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi</link>
	<description><![CDATA[ 今年は開発案件を進めたい ]]></description>
	<language>ja</language>
	<copyright>Copyright 2026</copyright>
	<lastBuildDate>Fri, 24 Apr 2026 10:26:19 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" target="_top">てがろぐ</a> Ver 3.4.0 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　Ｃ言語の共用体(union)ですが、教科書やら動画を見ます… ]]></title>
	<description><![CDATA[ 　Ｃ言語の共用体(union)ですが、教科書やら動画を見ますと「あまり使い道が無い」的な解説が多いような気がします。<br />　されど、今回のArt-Net系の装置では便利です。Art-Net のポート番号 0x1936(6454) の受信値をとりあえず突っ込むだけで要素毎に取り出すことも出来るからです。例えば ArtDMX は530バイトのパケットですが、受信値を uint8_t&#91;530&#93; (または unsigned char&#91;530&#93;) の配列として保存するだけで ArtDMX の構造体としても扱えます。パディングに注意は必要ですが、便利に使えると思うのです。ID、OpCode、ProVer をまとめて評価するのに先頭12バイトを uint8_t&#91;12&#93; としておいて memcmp で判別することも出来ます。AertDMX と別種の Art-Net パケットもシームレスに扱えそうです。<br />　天才を超越した神たちが何故 union を作ったのかを考えるとワクワクします。<br /><br />　とまぁ、最近Ｃ言語の理解が進んで一人笑いが止まらないアホの戯言でした。<br /><br />　オレメモです。<br />　gccで構造体のパディングを回避する書き方。struct に続いて「__attribute__((__packed__))」を入れるそうな。gcc独特の書式らしいので、コンパイラに合わせた書式を使ってください。<br /><br /><small class="decorationS"><span class="decorationF deco-code">typedef struct __attribute__((__packed__)) {<br />　uint8_t ID&#91;8&#93;;<br />　uint8_t OpCode&#91;2&#93;;<br />　uint8_t ProVerHi;<br />　uint8_t ProVerLow;<br />　uint8_t Sequence;<br />　uint8_t Physical;<br />　uint8_t SubUni;<br />　uint8_t Net;<br />　uint8_t LengthHi;<br />　uint8_t Length;<br />　uint8_t Data&#91;512&#93;;<br />} ad_t;<br /><br />ad_t ad_data;</span></small><br /><br />　ArtDMXを保存する構造体はこんな感じに書けばよいのでしょう。たぶん。<br />　この型を sizeof で見て530バイトならヨシです。<br /><br />　ついでに共用体の定義(案)です。<br /><br /><small class="decorationS"><span class="decorationF deco-code">// Art-Netの受信値を収める構造体<br />typedef struct __attribute__((__packed__)) {<br />　uint8_t resv&#91;530&#93;;<br />} an_t;<br /><br />// ArtDMXを取り出す構造体<br />typedef struct __attribute__((__packed__)) {<br />　uint8_t ID&#91;8&#93;;<br />　uint8_t OpCode&#91;2&#93;;<br />　uint8_t ProVerHi;<br />　uint8_t ProVerLow;<br />　uint8_t Sequence;<br />　uint8_t Physical;<br />　uint8_t SubUni;<br />　uint8_t Net;<br />　uint8_t LengthHi;<br />　uint8_t Length;<br />　uint8_t Data&#91;512&#93;;<br />} ad_t;<br /><br />// Art-Netの受信値を保存する共用体ループバッファ<br />union {<br />　an_t an_resv;<br />　ad_t ad_data;<br />} an_stack&#91;8192&#93;;</span></small><br /><br />　こういうことでいいのかな？<br />　共用体の書き方はまだよくわかってないのですけど。<br /><br />　共用体の配列を作って Art-Net のポートで受信したパケットを延々と保存します。8191番まで記録したら0に折り返すループバッファです。<br />　8192個あれば44fps、８センダー、各16ユニバースで最短でも1.45秒分の保存が出来るハズです。十進数で8192なのは２進数(16進数)でキリの良い数値のため折り返し評価が少ない処理で出来るからです。十進数8192は16進数0x2000でキリがよく処理しやすいのです。このあたりはアセンブリ言語だけでPICマイコンと会話をしてきた者にとって自然な着想です。10進数は人が日常的に使い慣れているだけで特筆するほど合理的な数体系ではありませんし、今どきのコンピュータ(論理回路)に合わせた方が便利です。<br /><br />　ヘッダーチェックは当該の配列要素(例えば an_stack&#91;1024&#93; )を示すポインタからmemcmpで12バイトをチェックすれば済みますので共用体には定義しません。<br />　ArtDMX以外のパケットにも使えるチェック方法です。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%ef%bc%a3%e8%a8%80%e8%aa%9e" class="taglink" title="Ｃ言語">#Ｃ言語</a>  -- Posted by 電装工芸 〔1896文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1202</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=1202</guid>
	<category>tegalog</category>
	<pubDate>Thu, 05 Mar 2026 06:26:33 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　オレメモ ]]></title>
	<description><![CDATA[ 　オレメモ<br /><br />　● Art-Netの受信の準備でするべきこと。<br /><br />　　・受信のタイムアウトを定義し、タイムアウトを例外としてキチンと処理する。<br /><br />　● Art-Netを受信したらするべきこと。<br /><br />　　・受信した「Art-Netのバイナリデータ」に「いつ」「どこからか(送信元)」を絡めて受信データとする。<br />　　・ユニバースと内部ルートの対照データを基に、データの参照キーを「ユニバース」から「ルート」に変換してキャッシュする。<br />　　・「いつ」をキーに送信元からの送信が無くなったと見なせるならキャッシュも含め送信元情報を消去する。<br />　　・「いつ」をキーにキャッシュの有効期限が切れたならキャッシュのレベル値をすべてゼロにする。<br />　　・送信元ごとのキャッシュをルートで丸めて一意のキャッシュにする。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a>  -- Posted by 電装工芸 〔361文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=173</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=173</guid>
	<category>tegalog</category>
	<pubDate>Sat, 05 Mar 2022 22:58:28 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　実機を離れて考えを進めると抜けが見えてきます。 ]]></title>
	<description><![CDATA[ 　実機を離れて考えを進めると抜けが見えてきます。<br />　一つ前のオレメモはArt-Netを受信していないときの対策です。タイムアウトを設定しませんと延々と待つだけの無限ループになり、適切な終了すら出来なくなります。一定時間受信が無いならそれをユーザーに伝えることも大切な処理です。<br />　その前の送信元が複数になった時の対策もそうです。ミキサー機能が無いと謳っても複数の接続をする人が居ないとも限りませんし、そんな人に限って勝手な想像通りに動かないと作った奴が悪いとかダメな製品だとかレッテルを貼ってくるものです。この件については副産物としてミキサー機能に至れそうな可能性が見えましたので「災い転じて何とやら」ですが、先入観を排除して可能性を熟慮することの大切さを改めて痛感です。<br /><br />　受信処理は試行錯誤しながらディレイを可能にしたことでソースコードが読みにくくなってきましたので、タイムアウトと複数の送信元への対応を加えながら読みやすく書き直しです。<br />　パラメータが増えてくると変数の命名に配慮するだけでも読みやすさが違ってきますので、この辺りも含めてよく考えていきます。<br /><br />　ここまでやってきて、思った以上に受信処理が大切なことに驚いています。<br />　ミキサーしかり、ディレイしかり、思い描いている機能の大半が受信直後の処理にかかっていたとは当初は全く思いもしませんでした。<br />　この辺りは所詮アマチュアの所業でありますが、まだまだ修行です。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%50%79%74%68%6f%6e" class="taglink" title="Python">#Python</a> <a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a>  -- Posted by 電装工芸 〔637文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=172</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=172</guid>
	<category>tegalog</category>
	<pubDate>Sat, 05 Mar 2022 22:19:38 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　オレメモ ]]></title>
	<description><![CDATA[ 　オレメモ<br /><br />　Pythonのsocket.recvfromでタイムアウト処理をする。<br /><br />　socketのインスタンスをsockとした場合、sock.recvfromの前に<br /><br />　sock.settimeout(&lt;タイムアウトの秒数&gt;)<br /><br />　とする。<br /><br />　sock.recvfrom(&lt;バッファ数&gt;) を try&#58; で実行し、except socket.timeout&#58; でタイムアウトエラーを拾う。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%50%79%74%68%6f%6e" class="taglink" title="Python">#Python</a>  -- Posted by 電装工芸 〔209文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=171</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=171</guid>
	<category>tegalog</category>
	<pubDate>Sat, 05 Mar 2022 22:01:21 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ 　本日は久しぶりの現地照明。現場って感じでホッとします。 ]]></title>
	<description><![CDATA[ 　本日は久しぶりの現地照明。現場って感じでホッとします。<br /><br />　実機での研究や試験は出来ませんが、アイデアが出てきたら整理しています。今日出てきたアイデアはArt-Netの受信に関するものです。<br />　Art-Netは複数の送信機を同じネットワークに接続することが出来ます。正しくはないけど間違ってもいない使い方ですが、期待してない挙動が起こっても面白くないので対応しといた方が良さそう。<br />　socketによる受信からはデータと送信元アドレスを取り出せますから、送信元アドレスをキーにデータを仕分けます。採用するデータは送信元を一つに限るのが道理な気もしますが、同じユニバース・スロットの最大値を採用したらHTPのミキサーになってしまいます。<br />　ミキサーは欲しい機能ですが、バカよけを施した副産物でミキサーになりそう。<br /><br /><a href="https&#58;//www.densokogei.jp/tegalog/tegalog.cgi?tag=%41%72%74%2d%4e%65%74" class="taglink" title="Art-Net">#&#91;Art-Net&#93;</a>  -- Posted by 電装工芸 〔369文字〕 ]]></description>
	<link>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=170</link>
	<guid>https://www.densokogei.jp/tegalog/tegalog.cgi?postid=170</guid>
	<category>tegalog</category>
	<pubDate>Sat, 05 Mar 2022 17:37:04 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

