ページへ戻る
印刷
gg00man/signal
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:gg00man/signal をテンプレートにして作成
開始行:
* シグナル関係 [[GUIGUI00_man]]
#contents
***lib_initsignalbox0_256
-lib_init + lib_opensignalbox
-準備中
-参考:[[gg00man/lib_getsig]]
***lib_getsig0w
-準備中
-参考:[[gg00man/lib_getsig]]
***lib_opensignalbox
int *lib_opensignalbox(int bytes, int *signalbox, int eo...
シグナルを扱うアプリでは、ライブラリを初期化したらできる...
コマンドを実行すること。
シグナルボックスをオープンする。bytesはシグナルボックス...
バイト単位で指定します(必ず4の倍数にすること)。あまり小...
しなければいけなくなるが、かといって大きすぎるのはメモリ...
256~4096くらいの範囲で使うべきだろう。signalboxはとりあ...
eosは必ず0で、rewindは0以外の適当な数値にする。これがrew...
シグナル番号になる。この関数は(int *)型の返値を持ち、そ...
先頭を指すポインタである。シグナルは全てint。シグナルボ...
読んでいき、読んだらポインタをインクリメントする。そうす...
読める。シグナル0が返されたら、シグナルが溜まっていない...
場合はポインタをインクリメントせずにスリープする。シグナ...
再度そこを読めばよい。
この調子でシグナルを処理していくと、そのうちポインタがシ...
末尾に到達する。その場合は次のシグナルは先頭に書かれてい...
システム側で必要に応じてやっているため、アプリはポインタ...
するごとにチェックする必要はない。システムがポインタの先...
必要だと判断するとrewindシグナルが書き込まれる。アプリ側...
受け取ったらポインタを先頭に戻す。
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_waitsignal
void lib_waitsignal(int opt, int signaldw, int nest) :
optを1にすれば、タスクはスリープし、事実上終了する。残り...
signaldwは、アプリがシグナルを処理したことをライブラリに...
処理したシグナルのバイト数を4で割った値を指定する。rewin...
例外で、rewindシグナルの直後に書かれた値の分だけlib_wait...
する。複数のシグナルを処理して、そのsignaldwの和を一度の...
通知してもよい。単にsignaldwを通知するためだけにlib_wait...
optを0する。
スリープのためにlib_waitsignal()を使うときは、この場合シ...
空になっていなければならない。もし1つでもシグナルが残っ...
何度lib_waitsignal()を呼んでもスリープすることはできない...
スリープしたければ、シグナルを読み進めて、とにかくシグナ...
空にする。読み終えたと報告したシグナルを後から読むことは...
あとで処理したければ、読み進めるシグナルを別のバッファに...
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**シグナル定義
***lib_definesignal1p0
void lib_definesignal1p0(int opt, int default_assign0, i...
struct LIB_WINDOW *default_assign2, int signal) :
キー入力とシグナル番号の対応づけを行う。まず、基本的にop...
には0x100を指定する。default_assign1はキーコード、defaul...
指定する。こうすることで、指定したウィンドウがアクティブ...
指定したキーが押されると、signalで指定されたシグナルがシ...
送られる。
default_assign1は、基本的にアスキーコードで指定する。' '...
たいていのキーが指定できる。しかし、カーソルキーやEnter...
指定できないキーもあり、それらは別にしていする。
例:
0x80 ESC 0x81 F1 0x82 F2 ...
0x84 F4 0x85 F5 0x86 F6 ...
0x88 F8 0x89 F9 0x8a F10 ...
0x8c F12
0xa0 Enter 0xa1 Backspace 0xa2 Tab
0xa4 Insert 0xa5 Delete 0xa6 Home ...
0xa8 PageUp 0xa9 PageDown
0xac Left 0xad Right 0xae Up ...
また、
for (i = 0; i < 10; i++)
lib_definesignal1p0(0, 0x100, '0' + i, win, 16 + ...
などと、連続するキーコードに対して連続する番号を割り当て...
0以外にして表現できる。上記の例の場合、
lib_definesignal1p0(9, 0x100, '0', win, 16);
と書き換えられる。optは連続して割り当てたいシグナル数か...
現在のバージョンのOSASKではlib_definesignal1p0()を呼び出...
この機能を利用してlib_definesignal1p0()の呼び出し回数を...
optに0、default_assign0に0x10、default_assign2に0を指定...
タイマーシグナル設定になる。default_assign1には対応する...
(オープン済みであること)を指定する。
参考になるサンプル:
キーシグナル:movec2(introa), keytstc0(introc)[拡張キ...
タイマーシグナル:dblcntc0(introb)
-p0crefリンク:
--キーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370/osa...
--タイマーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370...
--低レベルマウスシグナル:http://user.ecc.u-tokyo.ac.jp/~...
***void lib_definesignal0p0
void lib_definesignal0p0(int opt, int default_assign0, i...
int default_assign2);
シグナルの割り当て宣言が一通り終わったことをライブラリに...
4つ全ての引数は必ず0にする。
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**タイマー制御
***lib_waitsignaltime
void lib_waitsignaltime(int opt, int signaldw, int nest,
unsigned int time0, unsigned int time1, unsigned int...
タスクを一定時間スリープさせる。optには、0x7か0xfを指定...
signaldwとnestは0にする。time0~time2の設定方法は、以下。
まず、設定したい時間間隔を秒で表し、その整数部をtime1に...
32bitで書ききれなければ、time2に上位32bitを入れる。つま...
くらいまでは指定できる(上位数ビットは生かされないかもし...
また、秒単位では細かな制御には向かないので、小数部に2^32...
time0に設定する。これで1ns(ナノ秒)よりも細かい単位で指定...
実際はハードウェアの都合によりこの96bitの精度が完全に生...
限らない(限界まで生かす努力はする)。
optに0xfを指定した場合、
この関数をコールした時刻から指定された時間だけ待った後に...
一方、optに0x7を指定した場合は、
既に設定されている時間基点から指定された時間だけ待った後...
時間基点というのは、タスクが起動した時刻のことだが、lib_...
スリープすると目覚めた時刻が新しい時間基点にセットされる。
厳密に時間を意識するなら、optに0xfを指定するよりは0x7を...
なぜなら、目覚めた直後にすぐにスリープするわけではなく、
他の処理をする時間もあるからである。0xfを指定すると徐々...
0x7ならそういうことはない。誤差が出る場合は、アプリケー...
本来はこの関数は一定時間待つためのものではなく、時限付き...
というもので、シグナルがくれば時刻に達していなくてもタス...
シグナル処理をしながら時間を待つもっとも単純な方法はタイ...
使うことである。
この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい...
10ミリ秒単位であることを要請しているわけではない。11.52...
かまわない。頻繁に繰り替えすことがないのなら、10ミリ秒を...
将来のOSASKでは、連続して何度も10ミリ秒以下の指定をした...
10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは...
なるからやってはいけない。
参考になるサンプル:cntdwnc1(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_opentimer
void lib_opentimer(int slot) :
タイマーシグナルのために、タイマーをオープンする。slotに...
これはシステムタイマーslot番号で、これをオープンするとli...
使えなくなる。たいていはタイマーシグナルとlib_waitsignal...
ことはないので、この使い方を知っていれば十分だろう。lib_...
再び利用可能にするには、このタイマーをクローズする必要が...
タイマーは指定されたslotだけではなく、続く2つを合わせて...
なお、オープン直後のタイマーは休止状態にある。
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_closetimer
void lib_closetimer(int slot) :
オープンしていたタイマーをシステムに返しスロットを開放し...
クローズ後は、そのタイマーに対する設定はできない。再度オ...
古い設定は保存されていない。
タイマーをクローズする前には、タイマーを停止しておくこと。
slotはタイマーとして使っていたスロット番号を指定する。使...
最初の1つを指定する。
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimertime
void lib_settimertime(int opt, int slot,
unsigned int time0, unsigned int time1, unsigned int...
タイマーの時間設定をする。slotはタイマーのslot番号を指定...
time0~time2は、lib_waitsignaltime()のものと同じ表しかた...
optは0x32と0x12が使える。
(註)古いguide(たとえばguide5cやguide05など)には、optの...
できるような記述があるが、これは廃止された機能なので利用...
これらのbitは必ず0です。新しい版のOSASKではこれらの廃止...
optの0x32と0x12の違いは、lib_waitsignaltime()のoptでの0x...
つまり、0x32ではtime0~time2は「現在時刻に対する」値と解...
一方0x12では、「前回の設定時刻に対する」値と解釈される。
タイマーはこの関数によって待機状態に入り、一度待機状態に...
シグナルを発するか、もしくはキャンセルすることによって休...
次の設定はできない。
タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様...
10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位で...
わけではない。また頻繁に繰り替えすことがないのなら、10ミ...
下回ることがあってもかまわない。将来のOSASKでは、連続し...
指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される...
現在のOSASKでは、OSの動作が不安定になるので、やってはい...
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimer
void lib_settimer(int opt, int slot) :
設定したタイマーをキャンセルする(これはキャンセルであっ...
optには0x01を指定する。slotはタイマーのslot番号を指定す...
キャンセルすると、設定した時刻になってもシグナルを発しな...
また、何らかの事情があってシグナルを受け取る前にタイマー...
かならずこの関数でキャンセルしてからにすること。
もともと休止状態にあるタイマーに対し、キャンセルしてもよ...
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimertime2
void lib_settimertime2(int opt, int slot0, int slot1, un...
2つのタイマーの間の時間差を算出します。timeはunsigned in...
ンタ)で、最低でも3つの要素が必要です。計算された値が、ti...
time = slot1 - slot0
time[0]が下位で、time[2]が上位です。time[1]がちょうど秒...
タイマー設定の際のいつもの単位です。なおこの時に返される...
しません。おそらくOSASKのバージョンによってまちまちでし...
参考になるサンプル:starsc0(introd)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**タイマーの3つの状態
A.クローズ(オープンされていない)
B.休止状態(オープンされているが、時刻がきてもシグナルを...
C.待機状態(時刻がくればシグナルを発する)
A状態のタイマーに対してはオープンしかできない。オープン...
A状態のまま設定を行ってはいけない。
B状態のタイマーに対しては各種の設定とクローズができる。...
B状態のままだったり、A状態になったり、C状態になったりす...
C状態のタイマーに対しては時刻になってシグナルが発生する...
キャンセルしかできない。キャンセルするとB状態になる。な...
シグナルを発した後のタイマーは自動的にB状態になっている...
設定を行ったり、いきなりクローズするということは絶対に行...
* こめんと欄
-intro出現順のほうがいいかなあ?機能的に分類した最初の順...
-変更中でした…defsigは気づいたので直っています。タイマー...
-違和感がなくなりました。 -- [[K]] SIZE(10){2003-09-21 (...
#comment
終了行:
* シグナル関係 [[GUIGUI00_man]]
#contents
***lib_initsignalbox0_256
-lib_init + lib_opensignalbox
-準備中
-参考:[[gg00man/lib_getsig]]
***lib_getsig0w
-準備中
-参考:[[gg00man/lib_getsig]]
***lib_opensignalbox
int *lib_opensignalbox(int bytes, int *signalbox, int eo...
シグナルを扱うアプリでは、ライブラリを初期化したらできる...
コマンドを実行すること。
シグナルボックスをオープンする。bytesはシグナルボックス...
バイト単位で指定します(必ず4の倍数にすること)。あまり小...
しなければいけなくなるが、かといって大きすぎるのはメモリ...
256~4096くらいの範囲で使うべきだろう。signalboxはとりあ...
eosは必ず0で、rewindは0以外の適当な数値にする。これがrew...
シグナル番号になる。この関数は(int *)型の返値を持ち、そ...
先頭を指すポインタである。シグナルは全てint。シグナルボ...
読んでいき、読んだらポインタをインクリメントする。そうす...
読める。シグナル0が返されたら、シグナルが溜まっていない...
場合はポインタをインクリメントせずにスリープする。シグナ...
再度そこを読めばよい。
この調子でシグナルを処理していくと、そのうちポインタがシ...
末尾に到達する。その場合は次のシグナルは先頭に書かれてい...
システム側で必要に応じてやっているため、アプリはポインタ...
するごとにチェックする必要はない。システムがポインタの先...
必要だと判断するとrewindシグナルが書き込まれる。アプリ側...
受け取ったらポインタを先頭に戻す。
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_waitsignal
void lib_waitsignal(int opt, int signaldw, int nest) :
optを1にすれば、タスクはスリープし、事実上終了する。残り...
signaldwは、アプリがシグナルを処理したことをライブラリに...
処理したシグナルのバイト数を4で割った値を指定する。rewin...
例外で、rewindシグナルの直後に書かれた値の分だけlib_wait...
する。複数のシグナルを処理して、そのsignaldwの和を一度の...
通知してもよい。単にsignaldwを通知するためだけにlib_wait...
optを0する。
スリープのためにlib_waitsignal()を使うときは、この場合シ...
空になっていなければならない。もし1つでもシグナルが残っ...
何度lib_waitsignal()を呼んでもスリープすることはできない...
スリープしたければ、シグナルを読み進めて、とにかくシグナ...
空にする。読み終えたと報告したシグナルを後から読むことは...
あとで処理したければ、読み進めるシグナルを別のバッファに...
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**シグナル定義
***lib_definesignal1p0
void lib_definesignal1p0(int opt, int default_assign0, i...
struct LIB_WINDOW *default_assign2, int signal) :
キー入力とシグナル番号の対応づけを行う。まず、基本的にop...
には0x100を指定する。default_assign1はキーコード、defaul...
指定する。こうすることで、指定したウィンドウがアクティブ...
指定したキーが押されると、signalで指定されたシグナルがシ...
送られる。
default_assign1は、基本的にアスキーコードで指定する。' '...
たいていのキーが指定できる。しかし、カーソルキーやEnter...
指定できないキーもあり、それらは別にしていする。
例:
0x80 ESC 0x81 F1 0x82 F2 ...
0x84 F4 0x85 F5 0x86 F6 ...
0x88 F8 0x89 F9 0x8a F10 ...
0x8c F12
0xa0 Enter 0xa1 Backspace 0xa2 Tab
0xa4 Insert 0xa5 Delete 0xa6 Home ...
0xa8 PageUp 0xa9 PageDown
0xac Left 0xad Right 0xae Up ...
また、
for (i = 0; i < 10; i++)
lib_definesignal1p0(0, 0x100, '0' + i, win, 16 + ...
などと、連続するキーコードに対して連続する番号を割り当て...
0以外にして表現できる。上記の例の場合、
lib_definesignal1p0(9, 0x100, '0', win, 16);
と書き換えられる。optは連続して割り当てたいシグナル数か...
現在のバージョンのOSASKではlib_definesignal1p0()を呼び出...
この機能を利用してlib_definesignal1p0()の呼び出し回数を...
optに0、default_assign0に0x10、default_assign2に0を指定...
タイマーシグナル設定になる。default_assign1には対応する...
(オープン済みであること)を指定する。
参考になるサンプル:
キーシグナル:movec2(introa), keytstc0(introc)[拡張キ...
タイマーシグナル:dblcntc0(introb)
-p0crefリンク:
--キーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370/osa...
--タイマーシグナル:http://user.ecc.u-tokyo.ac.jp/~t40370...
--低レベルマウスシグナル:http://user.ecc.u-tokyo.ac.jp/~...
***void lib_definesignal0p0
void lib_definesignal0p0(int opt, int default_assign0, i...
int default_assign2);
シグナルの割り当て宣言が一通り終わったことをライブラリに...
4つ全ての引数は必ず0にする。
参考になるサンプル:movec2(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**タイマー制御
***lib_waitsignaltime
void lib_waitsignaltime(int opt, int signaldw, int nest,
unsigned int time0, unsigned int time1, unsigned int...
タスクを一定時間スリープさせる。optには、0x7か0xfを指定...
signaldwとnestは0にする。time0~time2の設定方法は、以下。
まず、設定したい時間間隔を秒で表し、その整数部をtime1に...
32bitで書ききれなければ、time2に上位32bitを入れる。つま...
くらいまでは指定できる(上位数ビットは生かされないかもし...
また、秒単位では細かな制御には向かないので、小数部に2^32...
time0に設定する。これで1ns(ナノ秒)よりも細かい単位で指定...
実際はハードウェアの都合によりこの96bitの精度が完全に生...
限らない(限界まで生かす努力はする)。
optに0xfを指定した場合、
この関数をコールした時刻から指定された時間だけ待った後に...
一方、optに0x7を指定した場合は、
既に設定されている時間基点から指定された時間だけ待った後...
時間基点というのは、タスクが起動した時刻のことだが、lib_...
スリープすると目覚めた時刻が新しい時間基点にセットされる。
厳密に時間を意識するなら、optに0xfを指定するよりは0x7を...
なぜなら、目覚めた直後にすぐにスリープするわけではなく、
他の処理をする時間もあるからである。0xfを指定すると徐々...
0x7ならそういうことはない。誤差が出る場合は、アプリケー...
本来はこの関数は一定時間待つためのものではなく、時限付き...
というもので、シグナルがくれば時刻に達していなくてもタス...
シグナル処理をしながら時間を待つもっとも単純な方法はタイ...
使うことである。
この時間間隔指定は、少なくとも10ミリ秒以上はあってほしい...
10ミリ秒単位であることを要請しているわけではない。11.52...
かまわない。頻繁に繰り替えすことがないのなら、10ミリ秒を...
将来のOSASKでは、連続して何度も10ミリ秒以下の指定をした...
10ミリ秒間間隔に補正される可能性がある。現在のOSASKでは...
なるからやってはいけない。
参考になるサンプル:cntdwnc1(introa)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_opentimer
void lib_opentimer(int slot) :
タイマーシグナルのために、タイマーをオープンする。slotに...
これはシステムタイマーslot番号で、これをオープンするとli...
使えなくなる。たいていはタイマーシグナルとlib_waitsignal...
ことはないので、この使い方を知っていれば十分だろう。lib_...
再び利用可能にするには、このタイマーをクローズする必要が...
タイマーは指定されたslotだけではなく、続く2つを合わせて...
なお、オープン直後のタイマーは休止状態にある。
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_closetimer
void lib_closetimer(int slot) :
オープンしていたタイマーをシステムに返しスロットを開放し...
クローズ後は、そのタイマーに対する設定はできない。再度オ...
古い設定は保存されていない。
タイマーをクローズする前には、タイマーを停止しておくこと。
slotはタイマーとして使っていたスロット番号を指定する。使...
最初の1つを指定する。
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimertime
void lib_settimertime(int opt, int slot,
unsigned int time0, unsigned int time1, unsigned int...
タイマーの時間設定をする。slotはタイマーのslot番号を指定...
time0~time2は、lib_waitsignaltime()のものと同じ表しかた...
optは0x32と0x12が使える。
(註)古いguide(たとえばguide5cやguide05など)には、optの...
できるような記述があるが、これは廃止された機能なので利用...
これらのbitは必ず0です。新しい版のOSASKではこれらの廃止...
optの0x32と0x12の違いは、lib_waitsignaltime()のoptでの0x...
つまり、0x32ではtime0~time2は「現在時刻に対する」値と解...
一方0x12では、「前回の設定時刻に対する」値と解釈される。
タイマーはこの関数によって待機状態に入り、一度待機状態に...
シグナルを発するか、もしくはキャンセルすることによって休...
次の設定はできない。
タイマーシグナルの発生頻度も、lib_waitsignaltime()と同様...
10ミリ秒以上はあってほしい。これももちろん10ミリ秒単位で...
わけではない。また頻繁に繰り替えすことがないのなら、10ミ...
下回ることがあってもかまわない。将来のOSASKでは、連続し...
指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される...
現在のOSASKでは、OSの動作が不安定になるので、やってはい...
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimer
void lib_settimer(int opt, int slot) :
設定したタイマーをキャンセルする(これはキャンセルであっ...
optには0x01を指定する。slotはタイマーのslot番号を指定す...
キャンセルすると、設定した時刻になってもシグナルを発しな...
また、何らかの事情があってシグナルを受け取る前にタイマー...
かならずこの関数でキャンセルしてからにすること。
もともと休止状態にあるタイマーに対し、キャンセルしてもよ...
参考になるサンプル:dblcntc0(introb)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
***lib_settimertime2
void lib_settimertime2(int opt, int slot0, int slot1, un...
2つのタイマーの間の時間差を算出します。timeはunsigned in...
ンタ)で、最低でも3つの要素が必要です。計算された値が、ti...
time = slot1 - slot0
time[0]が下位で、time[2]が上位です。time[1]がちょうど秒...
タイマー設定の際のいつもの単位です。なおこの時に返される...
しません。おそらくOSASKのバージョンによってまちまちでし...
参考になるサンプル:starsc0(introd)
-p0crefリンク:http://user.ecc.u-tokyo.ac.jp/~g240845/osa...
**タイマーの3つの状態
A.クローズ(オープンされていない)
B.休止状態(オープンされているが、時刻がきてもシグナルを...
C.待機状態(時刻がくればシグナルを発する)
A状態のタイマーに対してはオープンしかできない。オープン...
A状態のまま設定を行ってはいけない。
B状態のタイマーに対しては各種の設定とクローズができる。...
B状態のままだったり、A状態になったり、C状態になったりす...
C状態のタイマーに対しては時刻になってシグナルが発生する...
キャンセルしかできない。キャンセルするとB状態になる。な...
シグナルを発した後のタイマーは自動的にB状態になっている...
設定を行ったり、いきなりクローズするということは絶対に行...
* こめんと欄
-intro出現順のほうがいいかなあ?機能的に分類した最初の順...
-変更中でした…defsigは気づいたので直っています。タイマー...
-違和感がなくなりました。 -- [[K]] SIZE(10){2003-09-21 (...
#comment
ページ名: