2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する
本業では社内のサーバーやパソコンのメンテをしていますが、処理の待ち時間でC言語のお勉強。
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
オレメモであります。
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
RTCを装着したRaspberryPiは正常のようです。
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]
珍しく明日から3連休。すべてを自由に使えるワケではありませんがscocketのテストが出来そう。
Art-Netを扱える卓に繋いで実験しなければなりませんので場所が限られるのです。
#[Art-Net]
Art-Netを扱える卓に繋いで実験しなければなりませんので場所が限られるのです。
#[Art-Net]
RaspberryPiにRTC(リアルタイムクロック)を入れているのに起動の度に時間がずれる。
チェックしたところRTCモジュールの電池がダメになっています。定格3.3vのところ0.6vしかない。
RTCのチップはDS3231ですが、電池には充電タイプのLIR2032(LRではなくLIR)を使えばいいらしい。
amazonにあったのでポチる。先ほど届いたので取り付けたところRTCの機能が回復。
Art-Netエンジンのテストプログラムを書いていて気持ち悪かったのでスッキリしました。
追記
時刻合わせは
$ sudo ntpdate ntp.nict.jp
ネットワーク経由で現在時を取得し、
$ sudo hwclock -w
DS3231に書き込みます。
この手順をした後、電源を完全に切ってから起動すると時刻が合っているハズです。
時刻が初期化されてしまうならDS3231の電池がNGかと。
#RaspberryPi
チェックしたところRTCモジュールの電池がダメになっています。定格3.3vのところ0.6vしかない。
RTCのチップはDS3231ですが、電池には充電タイプのLIR2032(LRではなくLIR)を使えばいいらしい。
amazonにあったのでポチる。先ほど届いたので取り付けたところRTCの機能が回復。
Art-Netエンジンのテストプログラムを書いていて気持ち悪かったのでスッキリしました。
追記
時刻合わせは
$ sudo ntpdate ntp.nict.jp
ネットワーク経由で現在時を取得し、
$ sudo hwclock -w
DS3231に書き込みます。
この手順をした後、電源を完全に切ってから起動すると時刻が合っているハズです。
時刻が初期化されてしまうならDS3231の電池がNGかと。
#RaspberryPi
秋月電子通商さんでRaspberryPi4Bが販売されていました。
特需ですぐに無くなってしまう?
お金は辛いですが、とりあえず3個発注しました。
#RaspberryPi
特需ですぐに無くなってしまう?
お金は辛いですが、とりあえず3個発注しました。
#RaspberryPi
本業が落ち着いたので所属会社の作業部屋を片付けをしています。
コンセプトマシンで使うオンジナオイルの20Lの空き缶2個の処分で悩む。捨てようと思えば捨てられますが、一般家庭ゴミでは出せませんので面倒。
ならば、イスにしてしまいましょう。
上面に丸く切ったコンパネを貼り、床を傷つけないように底面の縁にゴムのエッジ材を取り回しました。すべて余り材とジャンク品で済んだので目先のお金はゼロ。
しばらくは作業部屋とジャンク材の片付けです。キレイ好きとは真逆ですが、次の作業のためにもやっておかないといけません。
#本業
コンセプトマシンで使うオンジナオイルの20Lの空き缶2個の処分で悩む。捨てようと思えば捨てられますが、一般家庭ゴミでは出せませんので面倒。
ならば、イスにしてしまいましょう。
上面に丸く切ったコンパネを貼り、床を傷つけないように底面の縁にゴムのエッジ材を取り回しました。すべて余り材とジャンク品で済んだので目先のお金はゼロ。
しばらくは作業部屋とジャンク材の片付けです。キレイ好きとは真逆ですが、次の作業のためにもやっておかないといけません。
#本業
Art-Netを受信する準備を進めています。
思った以上に面倒だったのはデータの比較です。受信値と期待値を比較して処理を分岐する処理は重要です。文字列ならstrcmp、バイナリならmemcmpを使います。どちらもstring.hの関数です。
どちらにしてもバイナリな感覚を持ち合わせていないと使えませんが、アセンブラに慣れた体にとって違和感はありませんし、ある意味とても明確な処理になるので悪い気はしません。Pythonが如何に簡単に書けるかを感じたりはしましたけどね。
あとはエンディアンの処理です。RaspberryPiはARM系なのでリトルエンディアンです。受信したArt-Netを仕分けて情報にするには2-4バイトのバイナリを数値化しないといけませんが、エンディアンを気にしながらバイナリを並べて処理します。並べたバイナリを数値化するにはカッコとアンパサンドを使った不思議な記述をしますが、理解不能なので定型句と思って使っています。
こんな底辺処理が整理出来たら受信テストですが、これらを先にやっておかないと受信値を人が読める形で表示することが出来ないのです。
#[Art-Net] #C言語
思った以上に面倒だったのはデータの比較です。受信値と期待値を比較して処理を分岐する処理は重要です。文字列ならstrcmp、バイナリならmemcmpを使います。どちらもstring.hの関数です。
どちらにしてもバイナリな感覚を持ち合わせていないと使えませんが、アセンブラに慣れた体にとって違和感はありませんし、ある意味とても明確な処理になるので悪い気はしません。Pythonが如何に簡単に書けるかを感じたりはしましたけどね。
あとはエンディアンの処理です。RaspberryPiはARM系なのでリトルエンディアンです。受信したArt-Netを仕分けて情報にするには2-4バイトのバイナリを数値化しないといけませんが、エンディアンを気にしながらバイナリを並べて処理します。並べたバイナリを数値化するにはカッコとアンパサンドを使った不思議な記述をしますが、理解不能なので定型句と思って使っています。
こんな底辺処理が整理出来たら受信テストですが、これらを先にやっておかないと受信値を人が読める形で表示することが出来ないのです。
#[Art-Net] #C言語
RaspberryPiをアップデートしたらネットワーク関連が動かなくなった。
起動パレードを見ると「Failed to start DHCP Client Daemon.」と出る。
このサイトの通り手直ししたら治った。
抜粋すると次の通り。
$ sudo nano /etc/systemd/system/dhcpcd.service.d/wait.conf
Change from:
[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w
To:
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpcd -q -w
wait.confを訂正するってことです。
#RaspberryPi
起動パレードを見ると「Failed to start DHCP Client Daemon.」と出る。
このサイトの通り手直ししたら治った。
抜粋すると次の通り。
$ sudo nano /etc/systemd/system/dhcpcd.service.d/wait.conf
Change from:
[Service]
ExecStart=
ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w
To:
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpcd -q -w
wait.confを訂正するってことです。
#RaspberryPi
ここ数日は本業で手一杯でした。ライトアップの施工があったのですが、建物の窓を光らせたいとのことで専用の行燈を製作してました。
簡単な作りではあったのですが思った以上に時間がかかり、徹夜して間に合わせたのはいいですが、その余波で心身共にキツイここ数日。
8月のお盆明けからの大連チャンでしたが、この後3月中旬までは緩い日程なので、各種製作や開発を進めて行けそうです。
同時にイロイロ進めますが、とにかくArt-Netエンジンを完成させたい。
Art-Netエンジンとは、Art-Netを受信し、Merge、In-Delay、Patch、Out-Curve、Out-Delayを施し、Art-Netとして送信するデバイスドライバの様なモジュールです。ユーザーインターフェースなどは別途製作ですが、これが完成すれば求めることの半分は完成です。
そのためにC言語を学習しているワケですが、ポインタ、構造体、共有メモリ、マルチプロセスの基本が見えてきましたので、これからしばらくはArt-Netの要であるscoketを試そうと思います。C言語でscoketを扱う情報は高位者による高位者向けの高度な物ばかりですが、幸いPythonでの前例がありますので、これをC言語に置き換える方向で読み解いていこうと思います。
学習を進めれば進める程「ライブラリの使い方はmanとヘッダーファイルを読めば分かるだろ!」という圧を強く感じますが、この感覚が自分にとっても当たり前になるように精進したいものです。
#C言語 #本業 #[Art-Net]
簡単な作りではあったのですが思った以上に時間がかかり、徹夜して間に合わせたのはいいですが、その余波で心身共にキツイここ数日。
8月のお盆明けからの大連チャンでしたが、この後3月中旬までは緩い日程なので、各種製作や開発を進めて行けそうです。
同時にイロイロ進めますが、とにかくArt-Netエンジンを完成させたい。
Art-Netエンジンとは、Art-Netを受信し、Merge、In-Delay、Patch、Out-Curve、Out-Delayを施し、Art-Netとして送信するデバイスドライバの様なモジュールです。ユーザーインターフェースなどは別途製作ですが、これが完成すれば求めることの半分は完成です。
そのためにC言語を学習しているワケですが、ポインタ、構造体、共有メモリ、マルチプロセスの基本が見えてきましたので、これからしばらくはArt-Netの要であるscoketを試そうと思います。C言語でscoketを扱う情報は高位者による高位者向けの高度な物ばかりですが、幸いPythonでの前例がありますので、これをC言語に置き換える方向で読み解いていこうと思います。
学習を進めれば進める程「ライブラリの使い方はmanとヘッダーファイルを読めば分かるだろ!」という圧を強く感じますが、この感覚が自分にとっても当たり前になるように精進したいものです。
#C言語 #本業 #[Art-Net]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131