タグ「Art-net」を含む投稿[102件]
セマフォの使い方が見えたので構造の重要な要素は獲得出来ました。
構成ですが、起動し mmap や pipe を定義し子プロセスの状態を監視する親プロセス「ArtNetPatch」、ユーザーの操作の相手やデータを画面表示をする子プロセス「ArtNetConsole」、Art-Netを送受信しパッチ処理やプロファイルカーブ処理を行う子プロセス「ArtNetEngine」の3本柱にしようと思います。
子プロセスの生成は fork を使います。fork ならば mmap、pipe、semaqhoe を子プロセスに渡すのが楽です。メモリの消費は多くなるようですが、実体の複製ですからポインタ祭りにならずに済みます。メモリの消費が多いと言っても、私が作るソフトウェアの規模などたかが知れていますので RaspberryPiCM4 の8GBモデルなら楽勝でしょう。
こういった構造は面倒な気もしますが、プロセス構造をシッカリ作っておけば開発が楽になると思いますし、何よりも「ArtNetEngine」の処理にリソースを集中したいのです。状態監視やユーザー相手は100msec毎で十分ですが、Art-Net の処理は5msec毎が欲しいのです。分散処理というより、求めるラップが違う処理を明確に分けたいのです。
処理時間を意識してしまうのは PIC マイコンからのクセですが、RaspberryPiCM4 で8ユニバースのパッチ処理をするならダイエットが大事かと。
#[Art-net] #C言語
構成ですが、起動し mmap や pipe を定義し子プロセスの状態を監視する親プロセス「ArtNetPatch」、ユーザーの操作の相手やデータを画面表示をする子プロセス「ArtNetConsole」、Art-Netを送受信しパッチ処理やプロファイルカーブ処理を行う子プロセス「ArtNetEngine」の3本柱にしようと思います。
子プロセスの生成は fork を使います。fork ならば mmap、pipe、semaqhoe を子プロセスに渡すのが楽です。メモリの消費は多くなるようですが、実体の複製ですからポインタ祭りにならずに済みます。メモリの消費が多いと言っても、私が作るソフトウェアの規模などたかが知れていますので RaspberryPiCM4 の8GBモデルなら楽勝でしょう。
こういった構造は面倒な気もしますが、プロセス構造をシッカリ作っておけば開発が楽になると思いますし、何よりも「ArtNetEngine」の処理にリソースを集中したいのです。状態監視やユーザー相手は100msec毎で十分ですが、Art-Net の処理は5msec毎が欲しいのです。分散処理というより、求めるラップが違う処理を明確に分けたいのです。
処理時間を意識してしまうのは PIC マイコンからのクセですが、RaspberryPiCM4 で8ユニバースのパッチ処理をするならダイエットが大事かと。
#[Art-net] #C言語
ArtNet-Patch で共有メモリの mmap を使うために セマフォ を勉強しています。mmap へのアクセスを排他的にするためです。
ただ、プロセス間のセマフォを使うような人は上級者が多いのか解説ページを見てもわかりにくい。
POSIX系のセマフォは物凄くシンプルな感じがしますが、とどのつまりがわからない。
man もわかっている人向けなのか引数の記述があるだけ。
もっと勉強です。
追記
なんて愚痴っていたらよい記事がありました。
開始が sem_init だったり sem_open だったりするけど、同じことみたいですからヘッダファイルのプロトタイプ記述を読めば良さそう。
「sem_overview - POSIX セマフォの概要」
「man-pages-ja sem_init(3)」
次の記事は、パーミッションにおける umask のことが主題ですが、セマフォの使い方がよくわかる。シンプルな記述を示してくれるこんな記事が嬉しい。
「sem_openで、Permission denied になる」
わかった気になった。
#[Art-net] #C言語
ただ、プロセス間のセマフォを使うような人は上級者が多いのか解説ページを見てもわかりにくい。
POSIX系のセマフォは物凄くシンプルな感じがしますが、とどのつまりがわからない。
man もわかっている人向けなのか引数の記述があるだけ。
もっと勉強です。
追記
なんて愚痴っていたらよい記事がありました。
開始が sem_init だったり sem_open だったりするけど、同じことみたいですからヘッダファイルのプロトタイプ記述を読めば良さそう。
「sem_overview - POSIX セマフォの概要」
「man-pages-ja sem_init(3)」
次の記事は、パーミッションにおける umask のことが主題ですが、セマフォの使い方がよくわかる。シンプルな記述を示してくれるこんな記事が嬉しい。
「sem_openで、Permission denied になる」
わかった気になった。
#[Art-net] #C言語
少し時間が空いたので ArtNet-Patch を考えていました。
部分はなんとなく出来ているので、全体の構造をどうするか。
まずプロセスを分けます。シングルプロセスではたぶんダメ。画面やキーボード操作を親プロセスにし、Art-Net の受信、パッチ処理、送信などを子プロセスとしようかと。子プロセスはタイムアウトする様にし、親プロセスからのリフレッシュが一定時間無ければ自動的に閉じることにします。こうしておけば親プロセスが飛んでも子プロセスがゾンビにならずいいかなと。操作が飛んでも Art-Net は生きている方がいいとする考え方もありますが、タイムアウト処理をコメントにすればそうなります。少なくとも開発中はタイムアウトした方がいいでしょう。
プロセス間は mmap や Pipe で繋ぎます。データには mmap を用い、コマンドには Pipe を用いるイメージです。
子プロセスの Art-Net 処理をイメージしながら表示画面やキーボード操作を考えてみましょう。
#[Art-net] #C言語
部分はなんとなく出来ているので、全体の構造をどうするか。
まずプロセスを分けます。シングルプロセスではたぶんダメ。画面やキーボード操作を親プロセスにし、Art-Net の受信、パッチ処理、送信などを子プロセスとしようかと。子プロセスはタイムアウトする様にし、親プロセスからのリフレッシュが一定時間無ければ自動的に閉じることにします。こうしておけば親プロセスが飛んでも子プロセスがゾンビにならずいいかなと。操作が飛んでも Art-Net は生きている方がいいとする考え方もありますが、タイムアウト処理をコメントにすればそうなります。少なくとも開発中はタイムアウトした方がいいでしょう。
プロセス間は mmap や Pipe で繋ぎます。データには mmap を用い、コマンドには Pipe を用いるイメージです。
子プロセスの Art-Net 処理をイメージしながら表示画面やキーボード操作を考えてみましょう。
#[Art-net] #C言語
ncurses はウィンドウも定義出来ます。
今時のウィンドウとは違い、画面の中に子領域を作るイメージです。この領域内で文字位置が指定出来ます。子領域の左上を文字位置の 0,0 として扱えます。
ダイアログウィンドウを描くことも出来ますし、画面の区分けにも使えます。
今ネタになっている ArtNet-Patch では、すべてのレイアウトに共通する要素をメイン画面に描き、機能ごとの要素をウィンドウにして描こうかなと。表示位置のオフセット管理が楽になりますし、複数のレイアウトで共通する要素は使いまわしがしやすくなります。
ncurses はキー入力も受け取れますので、ユーザーの相手にする部分は ncurses で全て作れそうです。
後は string の使い方を頭に刷り込めば画面は作れるかなと。C言語の欠点は文字列の扱い難さですが、文字列は char の配列であることを頭に染み込ませてから string を勉強しなおしましょう。
アホかと思うくらいC言語について検索してきたので、これまで ncurses を知らなかったのは何故だろう。
#[Art-net] #C言語
今時のウィンドウとは違い、画面の中に子領域を作るイメージです。この領域内で文字位置が指定出来ます。子領域の左上を文字位置の 0,0 として扱えます。
ダイアログウィンドウを描くことも出来ますし、画面の区分けにも使えます。
今ネタになっている ArtNet-Patch では、すべてのレイアウトに共通する要素をメイン画面に描き、機能ごとの要素をウィンドウにして描こうかなと。表示位置のオフセット管理が楽になりますし、複数のレイアウトで共通する要素は使いまわしがしやすくなります。
ncurses はキー入力も受け取れますので、ユーザーの相手にする部分は ncurses で全て作れそうです。
後は string の使い方を頭に刷り込めば画面は作れるかなと。C言語の欠点は文字列の扱い難さですが、文字列は char の配列であることを頭に染み込ませてから string を勉強しなおしましょう。
アホかと思うくらいC言語について検索してきたので、これまで ncurses を知らなかったのは何故だろう。
#[Art-net] #C言語
C言語のライブラリである ncurses を勉強しています。ANSIエスケープシーケンスを簡単に使える様にしたライブラリです。
コマンドで全て描画するので今時の画面作りツールに比べたら面倒ですが、ANSIエスケープシーケンスを直接触ると思えば超簡単。歴史の長いライブラリのためか、奇妙な変化球がなくシンプルなのが私好み。
x-windowベースのグラフィカルな画面にしてもいいのですが、リソースの節約をしたいし、あえてレガシーな風味がいいかなと思っております。
Art-Netを受信して処理して送信する機能は一応出来ているので、まずは画面作りのお勉強をしましょう。データのモニターが出来ないと見えない部分の動作のチェックもし難いですしね。
#[Art-net] #C言語
コマンドで全て描画するので今時の画面作りツールに比べたら面倒ですが、ANSIエスケープシーケンスを直接触ると思えば超簡単。歴史の長いライブラリのためか、奇妙な変化球がなくシンプルなのが私好み。
x-windowベースのグラフィカルな画面にしてもいいのですが、リソースの節約をしたいし、あえてレガシーな風味がいいかなと思っております。
Art-Netを受信して処理して送信する機能は一応出来ているので、まずは画面作りのお勉強をしましょう。データのモニターが出来ないと見えない部分の動作のチェックもし難いですしね。
#[Art-net] #C言語
こんなん欲しいなぁ~と思っていた RaspberryPiCM4 用のマザーボードを発見!

中華電機のサイト
EtherNet が2系統、RTC、電源入力がUSB-Cでなく裏側にある、etc.
PCI-Ex1 もあれば満点ですが、USB-3.0 が3系統あるので十分です。
これが入荷したら ArtNet-Patch の開発を再開しようかと。晩酌の肴ですけどね。
画面作りに ncurses を使えばと思っていましたが、ふと思いついて調べ直したらこれは便利。ネットにも man にもわかり易く整理された情報がないので、お試ししながらオレオレマニュアルを作成して本体ページにアップしましょう。自分の為にですけどね。
最近、RaspberryPi の価格も下がってきました。CM4 が 中華電機で1万円せずに買えます。
#RaspberryPi #C言語 #[Art-Net]

中華電機のサイト
EtherNet が2系統、RTC、電源入力がUSB-Cでなく裏側にある、etc.
PCI-Ex1 もあれば満点ですが、USB-3.0 が3系統あるので十分です。
これが入荷したら ArtNet-Patch の開発を再開しようかと。晩酌の肴ですけどね。
画面作りに ncurses を使えばと思っていましたが、ふと思いついて調べ直したらこれは便利。ネットにも man にもわかり易く整理された情報がないので、お試ししながらオレオレマニュアルを作成して本体ページにアップしましょう。自分の為にですけどね。
最近、RaspberryPi の価格も下がってきました。CM4 が 中華電機で1万円せずに買えます。
#RaspberryPi #C言語 #[Art-Net]
eth0 と eth1 に Art-Net のIPアドレスを設定する bashスクリプトです。
体裁の都合でタブ下げを全角空白にしています。パクってくださる方はテキストエディタなりで全角空白を削除するか半角空白に変換してください。utf-8でも全角空白はエラーの元です。
Art-Net の OEMコードを取っていませんので、0x29DA を勝手に使ってます。身近な器具で使われていないのと「肉だ」の語呂です。製品化する際には OEMコードを取得します。
set_artnet_ipaddress_eth0eth1.sh
// RaspberryPi:4B
// OS:RaspberryPiOS(bookworm) 32bit-Lite
// パーミッション:755
// bashスクリプトですのでファイルに実行権限を与え、Sudo で実行してください。
#!/bin/bash
# 定数定義
OEM_CODE_H=41 # Art-NetのOEMコードの上位バイト10進数で表記
OEM_CODE_L=218 # Art-NetのOEMコードの下位バイト10進数で表記 仮に0x29DA Oem_hdl_dmxnode8_1 HDL
NETWORK_SWITCH=2 # NetworkSwitch/ON=2,OFF=10
ETH0_NAME="artnet-in-eth0"
ETH1_NAME="artnet-out-eth1"
# 必要なファイル、コマンドの有無を確認
# bcコマンド
if !(type "bc" > /dev/null 2>&1); then
/usr/bin/echo "[Art-Net] Please Install the bc command."
exit
fi
## ipアドレス設定
ETH_NAME=$ETH0_NAME
for (( i=0; i<2; i++ )); do
## ethの有無を確認
P_eth=$(/usr/sbin/ifconfig | /usr/bin/grep eth$i)
if [ -z "$P_eth" ]; then
/usr/bin/echo "[Art-Net] eth"$i" does not exist"
exit
fi
## ethのMACアドレスを変数に格納する
MAC_ADDR_eth=$(/usr/bin/cat `find /sys/devices/ -name eth$i`/address)
## MACアドレスの有無を確認し、あればIPアドレスの設定を実行
if [ -n "$MAC_ADDR_eth" ]; then
# ethのIPアドレス作成
# 区切り文字「:」で配列変数化
MAC_eth=(${MAC_ADDR_eth//:/ })
# 16進数の文字列を数値に変換する
MAC_eth_4=$((16#${MAC_eth[3]}))
MAC_eth_5=$((16#${MAC_eth[4]}))
MAC_eth_6=$((16#${MAC_eth[5]}))
# Art-NetのIPアドレスを計算
ArtNet_IP_eth_1=$NETWORK_SWITCH
ArtNet_IP_eth_2=$(((MAC_eth_4 + OEM_CODE_H + OEM_CODE_L) % 256))
ArtNet_IP_eth_3=$MAC_eth_5
ArtNet_IP_eth_4=$MAC_eth_6
ArtNet_IP_eth=$ArtNet_IP_eth_1"."$ArtNet_IP_eth_2"."$ArtNet_IP_eth_3"."$ArtNet_IP_eth_4
/usr/bin/echo "[Art-Net] "$ETH_NAME" is "$ArtNet_IP_eth
# NetworkManager設定ファイルの有無確認
if [ ! -e "/etc/NetworkManager/system-connections/"$ETH_NAME".nmconnection" ]; then
# 設定ファイルが無いので新規設定し有効化
/usr/bin/nmcli connection add con-name $ETH_NAME type ethernet ifname eth$i connection.autoconnect yes ipv4.addresses $ArtNet_IP_eth"/8" ipv4.method manual ipv4.never-default no ipv6.method disabled >> /dev/null
/usr/bin/nmcli c reload
/usr/bin/nmcli c up $ETH_NAME >> /dev/null
else
# 設定ファイルがある IPアドレスが違うなら更新
# 現在のIPアドレスを取得
Current_IP_eth=$(/usr/bin/ip -f inet -o addr show eth$i|cut -d\ -f 7 | cut -d/ -f 1)
# 現在のIPアドレスがArt-NetのIPアドレスと違うなら更新
if [ "$Current_IP_eth" != "$ArtNet_IP_eth" ]; then
/usr/bin/nmcli c modify $ETH_NAME ipv4.address $ArtNet_IP_eth"/8"
/usr/bin/nmcli c down $ETH_NAME >> /dev/null
/usr/bin/nmcli c reload
/usr/bin/nmcli c up $ETH_NAME >> /dev/null
/usr/bin/echo "[Art-Net] Updated eth"$i" IP address."
else
# IPアドレスが同じなので何もしない
/usr/bin/echo "[Art-Net] eth"$i" does not need to be changed."
fi
fi
else
# MACアドレスを取得出来ません
/usr/bin/echo "[Art-Net] Unable to obtain IP address for eth"$i"."
fi
## eth1に切換え
ETH_NAME=$ETH1_NAME
## for 折り返し
done
手直ししたコードに差し替えました。
下手糞コードは勘弁してください。。。
スマホで表示すると表示が崩れますが原因は不明です。
#[Art-Net]
体裁の都合でタブ下げを全角空白にしています。パクってくださる方はテキストエディタなりで全角空白を削除するか半角空白に変換してください。utf-8でも全角空白はエラーの元です。
Art-Net の OEMコードを取っていませんので、0x29DA を勝手に使ってます。身近な器具で使われていないのと「肉だ」の語呂です。製品化する際には OEMコードを取得します。
set_artnet_ipaddress_eth0eth1.sh
// RaspberryPi:4B
// OS:RaspberryPiOS(bookworm) 32bit-Lite
// パーミッション:755
// bashスクリプトですのでファイルに実行権限を与え、Sudo で実行してください。
#!/bin/bash
# 定数定義
OEM_CODE_H=41 # Art-NetのOEMコードの上位バイト10進数で表記
OEM_CODE_L=218 # Art-NetのOEMコードの下位バイト10進数で表記 仮に0x29DA Oem_hdl_dmxnode8_1 HDL
NETWORK_SWITCH=2 # NetworkSwitch/ON=2,OFF=10
ETH0_NAME="artnet-in-eth0"
ETH1_NAME="artnet-out-eth1"
# 必要なファイル、コマンドの有無を確認
# bcコマンド
if !(type "bc" > /dev/null 2>&1); then
/usr/bin/echo "[Art-Net] Please Install the bc command."
exit
fi
## ipアドレス設定
ETH_NAME=$ETH0_NAME
for (( i=0; i<2; i++ )); do
## ethの有無を確認
P_eth=$(/usr/sbin/ifconfig | /usr/bin/grep eth$i)
if [ -z "$P_eth" ]; then
/usr/bin/echo "[Art-Net] eth"$i" does not exist"
exit
fi
## ethのMACアドレスを変数に格納する
MAC_ADDR_eth=$(/usr/bin/cat `find /sys/devices/ -name eth$i`/address)
## MACアドレスの有無を確認し、あればIPアドレスの設定を実行
if [ -n "$MAC_ADDR_eth" ]; then
# ethのIPアドレス作成
# 区切り文字「:」で配列変数化
MAC_eth=(${MAC_ADDR_eth//:/ })
# 16進数の文字列を数値に変換する
MAC_eth_4=$((16#${MAC_eth[3]}))
MAC_eth_5=$((16#${MAC_eth[4]}))
MAC_eth_6=$((16#${MAC_eth[5]}))
# Art-NetのIPアドレスを計算
ArtNet_IP_eth_1=$NETWORK_SWITCH
ArtNet_IP_eth_2=$(((MAC_eth_4 + OEM_CODE_H + OEM_CODE_L) % 256))
ArtNet_IP_eth_3=$MAC_eth_5
ArtNet_IP_eth_4=$MAC_eth_6
ArtNet_IP_eth=$ArtNet_IP_eth_1"."$ArtNet_IP_eth_2"."$ArtNet_IP_eth_3"."$ArtNet_IP_eth_4
/usr/bin/echo "[Art-Net] "$ETH_NAME" is "$ArtNet_IP_eth
# NetworkManager設定ファイルの有無確認
if [ ! -e "/etc/NetworkManager/system-connections/"$ETH_NAME".nmconnection" ]; then
# 設定ファイルが無いので新規設定し有効化
/usr/bin/nmcli connection add con-name $ETH_NAME type ethernet ifname eth$i connection.autoconnect yes ipv4.addresses $ArtNet_IP_eth"/8" ipv4.method manual ipv4.never-default no ipv6.method disabled >> /dev/null
/usr/bin/nmcli c reload
/usr/bin/nmcli c up $ETH_NAME >> /dev/null
else
# 設定ファイルがある IPアドレスが違うなら更新
# 現在のIPアドレスを取得
Current_IP_eth=$(/usr/bin/ip -f inet -o addr show eth$i|cut -d\ -f 7 | cut -d/ -f 1)
# 現在のIPアドレスがArt-NetのIPアドレスと違うなら更新
if [ "$Current_IP_eth" != "$ArtNet_IP_eth" ]; then
/usr/bin/nmcli c modify $ETH_NAME ipv4.address $ArtNet_IP_eth"/8"
/usr/bin/nmcli c down $ETH_NAME >> /dev/null
/usr/bin/nmcli c reload
/usr/bin/nmcli c up $ETH_NAME >> /dev/null
/usr/bin/echo "[Art-Net] Updated eth"$i" IP address."
else
# IPアドレスが同じなので何もしない
/usr/bin/echo "[Art-Net] eth"$i" does not need to be changed."
fi
fi
else
# MACアドレスを取得出来ません
/usr/bin/echo "[Art-Net] Unable to obtain IP address for eth"$i"."
fi
## eth1に切換え
ETH_NAME=$ETH1_NAME
## for 折り返し
done
手直ししたコードに差し替えました。
下手糞コードは勘弁してください。。。
スマホで表示すると表示が崩れますが原因は不明です。
#[Art-Net]
資料映像のレンダリング中に Art-Net の IPアドレスを設定する Bashスクリプトを書いてみました。
実機は自宅ですが ssh で遠隔操作が出来ます。
dhcpcd.conf の書き換えを NetworkManager のコマンドに置き換えるだけですので難しくはありません。
とりあえず本体プログラムを書くための準備は終わりました。
#[Art-Net]
実機は自宅ですが ssh で遠隔操作が出来ます。
dhcpcd.conf の書き換えを NetworkManager のコマンドに置き換えるだけですので難しくはありません。
とりあえず本体プログラムを書くための準備は終わりました。
#[Art-Net]
RaspberryPiの開発セットが完成しました。
開発に使用する用品をマジックテープ付きの合板に貼り付けてスロットインします。
常に仮組みしておく意図です。作業の都度組まなくても済みますし作業場所も選びません。

現在の案件はArtNetPatchですからHubが2個です。一番奥のスロットにRaspberryPiが入っています。
仕上げは大雑把ですが便利です。
#RaspberryPi #[Art-Net]
開発に使用する用品をマジックテープ付きの合板に貼り付けてスロットインします。
常に仮組みしておく意図です。作業の都度組まなくても済みますし作業場所も選びません。




現在の案件はArtNetPatchですからHubが2個です。一番奥のスロットにRaspberryPiが入っています。
仕上げは大雑把ですが便利です。
#RaspberryPi #[Art-Net]
トランクにモニタとSFX電源を入れた物がまとまりました。RaspberryPi トランクとでも呼ぶことにします。

RaspberryPi と EtherNetHub を実装して ArtNetPatch の開発環境とします。
#電子工作 #[Art-Net]




RaspberryPi と EtherNetHub を実装して ArtNetPatch の開発環境とします。
#電子工作 #[Art-Net]